iterator迭代器
对于可迭代的数据解构,ES6在内部部署了一个[Symbol.iterator]属性,它是一个函数,执行后会返回iterator对象(也叫迭代器对象),而生成iterator对象[Symbol.iterator]属性叫iterator接口,有这个接口的数据结构即被视为可迭代的
数组中的Symbol.iterator方法(iterator接口)默认部署在数组原型上:
iterator迭代器是一个对象,它具有一个next方法,next方法返回又会返回一个对象,有value和done两个属性,value即每次迭代之后返回的值,而done表示是否还需要再次循环,可以看到当value为undefined时,done为true表示循环终止。
- 可迭代的数据结构会有一个[Symbol.iterator]方法
- [Symbol.iterator]执行后返回一个iterator对象
- iterator对象有一个next方法
- 执行一次next方法(消耗一次迭代器)会返回一个有value,done属性的对象
Promise
回调函数
JS是单线程的,因为多个线程改变DOM的话会导致页面紊乱,所以设计为一个单线程的语言,但是浏览器是多线程的,这使得JS同时具有异步的操作,即定时器,请求,事件监听等,而这个时候就需要一套事件的处理机制去决定这些事件的顺序,即Event Loop(事件循环),使用回调函数处理异步请求相当于把你的回调函数置于了一个黑盒,虽然你声明了等到收到响应后执行你提供的回调函数,可是你并不知道这个第三方库会在什么具体会怎么执行回调函数。
回调函数的缺点
-
多重嵌套,导致回调地狱
-
代码跳跃,并非人类习惯的思维模式
-
信任问题,你不能把你的回调完全寄托与第三方库,因为你不知道第三方库到底会怎么执行回调(多次执行)
-
第三方库可能没有提供错误处理
-
不清楚回调是否都是异步调用的(可以同步调用ajax,在收到响应前会阻塞整个线程,会陷入假死状态,非常不推荐)
Promise
Promise是一个构造函数,通过new关键字创建一个Promise的实例。
1.多重嵌套,导致回调地狱
Promise在设计的时候引入了链式调用的概念,每个then方法同样也是一个Promise,因此可以无限链式调用下去,配合箭头函数,明显的比之前回调函数的多层嵌套优雅很多
2.信任问题,你不能把你的回调完全寄托与第三方库,因为你不知道第三方库到底会怎么执行回调(多次执行)
Promise本身是一个状态机,具有以下3个状态
- pending(等待)
- fulfilled(成功)
- rejected(拒绝)
当请求发送没有得到响应的时候为pending状态,得到响应后会resolve(决议)当前这个Promise实例,将它变为fulfilled/rejected(大部分情况会变为fulfilled)
当请求发生错误后会执行reject(拒绝)将这个Promise实例变为rejected状态
一个Promise实例的状态只能从pending => fulfilled 或者从 pending => rejected,即当一个Promise实例从pending状态改变后,就不会再改变了(不存在fulfilled => rejected 或 rejected => fulfilled)
Module
ES6 Module使用import关键字导入模块,export关键字导出模块,它还有以下特点
1.ES6 Module是静态的,也就是说它是在编译阶段运行,和var以及function一样具有提升效果(这个特点使得它支持tree shaking)
2.自动采用严格模式(顶层的this返回undefined)
3.ES6 Module支持使用export {<变量>}导出具名的接口,或者export default导出匿名的接口
export default这种导出的语法其实只是指定了一个命名导出,而它的名字叫default,换句话说,将模块的导出的名字重命名为default,也可以使用import <变量> from <路径> 这种语法导入
Object.assign
Object.assign遍历需要合并给target的对象(即sourece对象的集合)的属性,用等号进行赋值,这里遍历{a:1}将属性a和值数字1赋值给target对象,然后再遍历{b:2}将属性b和值数字2赋值给target对象
-
Object.assign是浅拷贝,对于值是引用类型的属性,拷贝仍旧的是它的引用
-
可以拷贝Symbol属性
-
不能拷贝不可枚举的属性
-
Object.assign保证target始终是一个对象,如果传入一个基本类型,会转为基本包装类型,null/undefined没有基本包装类型,所以传入会报错
-
source参数如果是不可枚举的数据类型会忽略合并(字符串类型被认为是可枚举的,因为内部有iterator接口)