一、迭代协议
两个协议
- 可迭代协议
- 迭代器协议
可迭代协议
允许Js对象去定义或定制迭代行为。(可迭代的判断标准)
特点:可以使用
for...of...
、yield*
、解构、扩展运算符来进行迭代(1) ES6内置的可迭代类型
Array
、Map
、Set
可调用
.keys()
、.values()
、.entries()
获取内置迭代器(2) 自定义迭代对象
原型上加一个
@iterator
方法,即名字是Symbol.iterator
的属性。(3)
Symbol.iterator
返回一个对象的无参函数。则被返回的对象符合迭代器协议。
迭代器协议
定义了一种标准的方式来产生一个有限或无限序列的值。(迭代的实现)
(1) 条件
实现一个
next()
方法,返回一个对象的无参函数,被返回对象拥有两个属性:done
value
几个名词之间的关系
(1) 囊括范围
可迭代对象 > 迭代器 > 生成器
(2) 生成器Generator
是一种返回迭代器的函数,生成器返回的对象是一个携带
[Symbol.iterator]
属性和next()
方法的对象,所以这个对象既是迭代器,又是可迭代对象。(3) ES6内置可迭代对象
这些可迭代对象都内置了默认的迭代器。
二、Generator
- Generator可以理解为一个状态机,内部封装了很多状态,返回一个迭代器
Iterator
对象; - 迭代器
Iterator
对象:定义标准方式产生一个有限或无限序列值,迭代器有next()
方法; - 多次返回可以被
next
多次调用,最大特点是可以控制执行顺序
yield
和yield*
的区别:
yield*
接收一个可迭代对象,称之为委托迭代,相当于多个yield
合并到一起。
三、PolyFill
原理图
代码
function createIterator(items) {
let i = 0
return {
next() {
let done = i >= items.length
let value = !done ? items[i++] : void 0
return { done, value }
},
[Symbol.iterator]: function() {
return this
}
}
}
let iterator = createIterator([1, 2, 3])
...iterator // 1, 2, 3