前端学校小白笔记

225 阅读9分钟

JS数据类型!

1:基本数据类型:

(1)number(数值)

正数 ,负数, 0, 小数 ,infinity-无穷大,NaN不是有效的数字

空字符产转换为数字是0

布尔转换为数字true是1.false是0

null是0

undefined是NaN

Symobl不能转换为数字

NaN与任何人都不相等,即使是NaN与NaN都不相等

(2)string(字符串)

用双引号"",单引号'',反引号(模板字符串)``,这些抱起来的都是字符串,

其他数据类型转换为字符串类型,1:value.toString(),2:String(value)

(3)Boolean(布尔)

true/false

0/NaN/空字符产/null/undefined这些值都是false

其他数据类型转换为布尔,![value]先转换为布尔再取反

(4)null(空值)
(5)undefined(未定义的)
(6)symbol

唯一值

(7)bigint

最大安全数,最小安全数

2:引用数据类型

object(对象)

包括普通对象{}, 由多组键值对组成,属性名和属性值{key:value}

Array数组[],索引值从0开始,每一个索引对应一个值

类数组(class)

实例对象,

原型对象

数组对象[]

正则对象/^$/

日期对象

创建对象方法

1 let obj = new Object()

2 let obj = {}

function(函数)

定义函数,function a(x,y){},普通函数,a为函数名,x和y为为形参

调用函数,a(),内部可以传入实参

函数又分为匿名函数和函数表达式,区别是一个有名字 一个没有名字

立即执行函数:(function(){})(),无需调用即可自己执行自己!

执行函数时需要传递实参,但是传递多少个实参不确定,想接受实参信息,可以用函数内置arguments

也可以用ES6新增剩余运算符...,一般写到形参最后面,如果前面没有形参,则所有实参信息都在里面,

剩余运算符又兼容性问题,arguments没有兼容问题,

ES6新增箭头函数(形参)=>{函数体 },箭头函数都是函数表达式,箭头函数中没有arguments,没有this指向

let fn=(x)=>y=>{x+y}

3:数据类型检测

1:typeof!

2:instanceof!

3:constructof!

4:onject.prototype.toString.call

4=号的区别

=赋值,将右侧值赋值给左侧变量

+=:a=a+5,相当于a+=5

-=:a=a-5,相当于a-=5

*=同上

/=同上

%=同上

==相等,对比时可能会存在数据转换,隐式数据转换

===绝对相等,要求类型和值都要相等

5for循环

for (let i = 0; i < array.length; i++) {

}

1执行初始化表达式,初始化变量 let i = 0

2执行表达式,判断是否执行循环 i < array.length

3执行语句 大括号里面的

4更新表达式 i++

for循环,从哪开始,到哪结束,加还是减

6ES6解构赋值

主要针对数组和对象,左侧定义和右侧类似的结构,申明几个变量可以快速得到每一部分信息

let array=[1,2,3,4,5], let [x,y]=array console.log(x,y) 此时的x为1,y为2

如果let [x,...y]=array console.log(x,y)此时的x为1,y为一个数组,包含1后面的所有项

那么如果只想要数组里的3和4,那么申明方法就是let [,,x,y]=array此时得到的正好是3和4

对象的解构赋值

let obj={

a='张三',

b=18

}

let{a,b}=obj,申明变量需要和属性名保持一致

7交换两个变量的值

let a=1

let b=2

用一个新的变量c来做中转

let c=a

a=b

b=c

此时就可以完成两个变量值的交换

8截取字符串方法

substr(n,m)索引从n开始,m代表截取的个数,。截取多少个

substring(n,m)索引从n开始。截取到m处,但是不包含m

slice(n,m)和substring一样,但是可以以负数作为索引

9逻辑||和逻辑&&

布尔值运算

逻辑||(与):两个都为真返回true,如果第一个值为false则直接返回第一个,不会管第二个值,短路运算

逻辑&&(或):两个只要有一个是true就返回true,两个都为false才返回false

逻辑&&优先级高于逻辑||

非布尔值运算

会先将值转换为布尔值再进行运算,并返回其原值

10if语句

if ( 条件表达式){

语句...

}else{f

语句...

}

条件运算再执行时如果条件1满足则执行条件一的语句,如果条件二满足则执行条件二语句

if...elseif...else。其中elseif可以有个

11条件分支语句(switch)

seitch(条件表达式){

case1 表达式

语句....

break

case2 表达式

语句....

break

}

switch里面表达式与case表达式依次比较,如果相同就执行当前case中语句,执行完毕进行break直接退出,不会往下进行操作

12while循环语句

while( ){

}

13break和continue

break结束整个循环,步长累计也不再执行

continue,结束本轮循环进行下一轮循环

14栈内存和堆内存

1栈内存:

变量保存在栈内存中,基本数据类型都保存在栈内存中,类似 let a = 1 再用let b= a,b只是复制了a的值,但是值与值之间都是独立存在的,互不影响,修改一个变量不会影响其他的变量,

2堆内存

对象是保存到堆内存中的,let obj=new Object(), 此时obj变量名储存在栈内存中,栈内存中保存的是new object()的引用地址,

如果两个变量引用的是同一

15作用域

1全局作用域

页面打开时创建,页面关闭时销毁,

全局作用域中创建的变量都会作为window对象属性保存

全局作用域中创建的函数都会作为window方法使用

2局部作用域(函数作用域)

调用函数时创建函数作用域,函数执行完毕后,函数作用域销毁

每次调用函数就会创建一个新的函数作用域,他们之间是相互独立的

函数作用域可以访问到全局作用域的变量

全局作用域不可以访问函数作用域中的变量

16构造函数的原型对象

构造函数和被构造函数制造出来的实例对象都指向同一原型对象,都可以访问到此prototype

当我们创建构造函数时,可以将这些对象共有的属性和方法添加到原型对象上,不用为每一个对象添加,这样不会影响到全局作用域,而且每个对象都会拥有这些方法和属性

注意;原型对象也会有原型,如果要找方法和属性可以一直往下找原型的原型吗,直到找到object

object也有 _ proto _

17数组

数组也是一个对象,与普通对象相同都是用来储存值的,与对象不同的是对象是通过字符串作为属性名的,但是数组是以数字作为索引来操作元素的,

索引都是以0开始的,

创建数组对象

1:let arr= new Array()

2:字面量创建数组,let arr = []

数组内添加元素 arr[0]=1 arr[1]=2

读取数组中元素 console.log(arr[0]) 返回为1

读取数组的长度 arr.leng

18数组的方法

1 push() 向数组末尾添加一个或多个元素,并返回数组新的长度

2 pop 删除数组最后一个元素,并将删除元素作为返回值

3 unshift 向数组最前面添加一个或者多个元素 并返回的数组新的长度

向最前面添加元素以后其他所有的元素的索引都会依次进行调整

4 shift 删除数组第一个元素 并将被删除元素作为返回值返回

数组的遍历、

遍历数组就是将数组中所有元素都取出来

arr.for Each(item,index)=>{} 数组有多少个元素就会执行多少次,里面会有三个参数。第一个为正在遍历的值,第二个值为正在被遍历的值的索引,第三个是正在被遍历的数组

slice方法

slice(start,end)

可以用来从数组中提取指定元素,1截取开始的位置的索引,2截取结束位置的索引,如果最后一位不写会默认到数组最后一位

该方法不会给改变原数组,而是将截取到的元素封装到一个新的数组中返回

splice方法

arr.splice()

删除元素并向数组添加新元素,使用solice会影响到原数组。会将指定元素从原数组中删除,并将被删除的元素作为返回值

参数。第一个表示开始位置的索引,第二个参数表示要删除的数量,第三个参数和后面的参数可以传递新的元素,这些会自动插入到索引开始位置的前面

concat方法

concat()可以连接两个或者多个数组,并将新的数组返回,不会对原数组影响

join方法

join()该方法可以将一个数组转换为字符串,该方法不会对原数组产生影响,而是将转换后的字符串作为结果返回

join()中可以指定一个字符串作为参数,这个参数将会成为数组元素的连接符,不指定连接符默认以逗号作为连接符

reverse方法

reverse()该方法用来反转数组,前面到后面,后面到前面。该方法会直接修改原数组

sort方法

sort()对数组进行排序,也会影响原数组,默认会按照unicode进行排序,

19函数的方法

两个都是函数的方法,需要通过函数来调用,都会执行函数,可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行时的this,

1:call( )

function.call( )

2:apply( )

function.apply( )

20date对象

let date=new Date( )

构造函数

获取当前的执行时间

21math

math.abs()返回数的绝对值

math.ceil( )向上取整,小数位只要有值就向上进1

meth.floor()向下取整,小数部分会舍弃

math.round()四舍五入

math.random()生成0-1之间的随机数。不包含0和1

max()获取多个数中的最大值

min()获取多个数中的最小值

22DOM

Document Object Model

文档对象模型

获取节点元素

document.getElementByClassName () 通过class获取

document.getElementById () 通过id获取

document.getElemenstByTagName() 通过标签名获取一组节点元素对象

document.getElemenstByName() 通过name属性获取一组元素节点

document.querySelector() 新增,根据css选择器来查询元素节点,id用#。class用.,该方法只会返回唯一一个元素,如果有多个元素只会返回第一个符合元素

document.querySelectorAll() 该方法与上面用法类似,不同的是他会将符合条件的元素封装到一个数组中全部返回

document.body 获取body

document.documentElement 获取html根标签

增删改查节点

document.createElement()创建元素节点,

document.createTextNode()创建文本 节点,

appendChild()向一个父节点中添加一个新的子节点;用法:父节点.appendchild(子节点)

insertBefore()在指定的子节点前面添加一个新的节点;用法:父节点.insertBefore(新节点,旧节点)

replaceChild()替换节点;用法:父节点.replaceChild(新节点,旧节点)

removeChild()删除一个子节点;用法:父节点.remoceChild(要删除的子节点)

23事件对象

event

clientX可以获取鼠标指针在当前可见窗口的水平座标 window.event.clientX

clientY可以获取鼠标指针在当前可见窗口的垂直座标 window.event.clientY

pageX可以获取到鼠标相对于当前页面的水平座标

pageY可以获取到鼠标相对于当前页面的垂直座标

mousemove鼠标移动事件

24DOM事件流

DOM事件分为三个阶段

1 捕获阶段 从大到小,从上往下

2当前目标阶段

3冒泡阶段 从小到大,从里到外

js代码只能执行捕获或者冒泡阶段的其中一个阶段

xx.addEventListener('click',functiong(){} 此处如果填true那么处于捕获阶段,如果是false或者不写就是开启冒泡)

有一些事件没有冒泡,比如blur,focus,mouseenter,mouseleave

阻止默认事件,e.preventDefault(),比如点击页面跳转等

阻止事件冒泡,e.stopPropagation()

25事件委托

指将事件统一绑定给该元素的共同父元素,这样当后代元素上的事件触发后,会一直冒泡到祖先元素

事件委托是利用了冒泡,通过事件委托可以减少事件绑定的次数,提高程序的性能

26innerHTML和creatElemnt

二者都可以创建一个元素节点,但是innerHTML效率会更高,不能采取拼接字符串方法不然会很慢。可以采用数组形式拼接,结构稍微负责一些,creatElement创建效率会低一点,但是结构更加清晰

27注册事件的两种方式

1 event.onxxxx=function(){

}

2event.addEventlistener('xxxx',functiong(){

}) 第二种方法不用带on,但小括号里面的注册事件必须是字符串类型的,同一元素和同一事件可以添加很多个侦听器

28BOM

浏览器对象模型,核心是window

bom是由各浏览器厂商制定的

是最大的对象,包含dom

29窗口加载事件

window.addEventListener('load',functiong(){

}) 窗口加载事件,当文档内容完全加载完成会触发该事件,就会调用此函数

30调整页面窗口事件

window.addEventListener('resize',function(){

})调整窗口大小加载事件,当触发时就会调用该函数

31定时器

1:settimeout() 只调用一次

里面有两个参数。第一个是调用的函数,可以是直接函数,也可以是函数名;第二是延迟的毫秒数,时间也可以省略

该定时器会在定时器到期后执行调用函数

一个页面中可能会有很多定时器,需要给每个定时起标识符,可以区别每一个定时器,也可以方便清除

2:setInterval()重复调用

里面有两个参数。第一个是调用的函数,可以是直接函数,也可以是函数名;第二是延迟的毫秒数,时间也可以省略

该定时器会重复调用一个函数,每隔一段时间就回会去调用一次函数

一个页面中可能会有很多定时器,需要给每个定时起标识符,可以区别每一个定时器,也可以方便清除

清除定时器

clearTimenout(定时器标识符)

clearInterval(定时标识符)

32this指向问题

1:全局作用域或者普通函数中this指向全局对象window,定时器里面的this也指向window

2:方法调用中this被谁调用就指向谁

3:构造函数中的this指向构造函数的实例

33同步任务和异步任务

同步任务在主线程执行栈中,

任务队列,异步任务分类:普通事件:click,resize,资源加载:load,error,定时器:clearTimenout

,clearInterval等

34location

由通信协议,域名,端口号,路径,参数和锚点组成

35offset

offsetparent获取元素距离带有定位的父元素的位置,如果父元素没有定位,则返回以body为准的距离

获得自身的大小,返回数值不带单位

offsetTop返回带有定位父元素上方的偏移

offsetLeft返回带有定位父元素左边框的偏移

offsetWidth返回包括自身的padding,border,内容区域的宽度吗,不包含margin

offsetHeight返回包括自身的padding,border,内容区域的高度不包含margin

\