js进阶
- 原始类型与引用类型
- var、let与const
- 解构赋值
- 箭头函数
- 防抖与节流
- 回调与promise对象
- 原型对象
- this关键字
- call apply bind
- 拷贝
- 单线程
- process.next与setImmdeiate
- 事件循环
- 宏任务 微任务
- DOM事件流与事件委托
- symbol
原始类型与引用类型
1、赋值:原始类型直接赋值;引用类型赋指向
2、比较:原始类型比较的是值是否相等;引用类型比较的是否指向同一对象
3、传参:原始类型作为参数,函数内操作不影响实参的值;引用类型会影响实参的值
var、let与const
1.var定义的变量没有块级作用域的概念;let定义的变量有块级作用域。一般使用let
2.const定义常量,值不能修改。const可以定义对象,也不可修改;但对象属性可以修改。
3.一般定义函数、对象和不变的值,使用const
解构赋值
数组的解构赋值
对象的解构赋值
利用解构赋值使代码变得简洁
箭头函数
箭头函数没有this概念。
只有一个参数可以不写(),只有一个返回值可以不写return。
防抖与节流
防抖:用户触发事件过于频繁,只要最后一次事件的操作
节流:控制高频事件触发次数
回调与promise对象
回调函数嵌套过多
promise(resolve),resolve为传出的数据,promise通过.then获得异步数据
只有调用resolve时才会执行then,resolve传出的数据为then函数形参
async函数,awati直接获取resolve传递出来的异步数据,async返回值为promise对象
原型对象
每一个对象都有自己的原型对象,可以使用自己原型对象上的所有树形和方法
可prototype扩展对象
通过类也可以获得原型
原型链原型逐层查找
this关键字
this指向函数调用者
new会创建对象,将构造函数中的this指向创建出来的对象
call apply bind
都可以改变this指向
call可以调用函数,call( , ),()首先写this指向谁,后面依次写要传递的参数
apply剋调用函数,apply( ,[ ])首先写this指向谁,数组中依次写要传递的参数
bind不能调用函数,会返回一个函数,其余与call一样
call可以实现多重继承
拷贝
浅拷贝: 在内存中不会开辟新空间
深拷贝:会在内存中创建新空间
单线程
同步:按顺序执行
异步:先执行一部分,之后再执行。(计时器、ajax、读取文件等)
同步程序执行完成后再执行程序异步
process.next与setImmdeiate
在node中 process.nextTick:在同步程序完成之后,异步执行之前执行;setImmediate在一次事件循环异步程序执行完成之后执行
事件循环
同步程序在运行栈中执行,异步程序在达成条件时放在任务队列中,事件循环则是检测异步程序是否达成条件,并将异步程序放在任务队列中
宏任务 微任务
异步程序中才会有宏任务、微任务
宏任务:计时器 ajax 读取文件
微任务:promise.then
先执行微任务 再执行宏任务
1、同步程序
2、process.nextTick
3、微任务
4、宏任务
5、setImmediate
new promise为同步程序 .then为异步
axios.get()通过resolve传出数据 再使用.then获得
async返回值为promise对象 await可以直接获取promise对象数据 与.then一样
DOM事件流与事件委托
事件流
事件捕获 :从外到里
事件冒泡 :从里到外
一般事件在冒泡阶段触发
事件委托
子级事件委托给父级处理
symbol
数据类型:数值、字符串、布尔、对象、null、undifined以及新增的symbol
symbol可以添加描述,可以当作对象的属性名,通过对象[属性名]获取symbol值,不能被for in 获取
通过Object.getOwnPropertySymbols获取对象属性为symbol类型的全部属性名
如果对象有symbol.iterator这个属性,就可以被for of遍历