使用户可以在容器对象上遍访的对象,使用该接口无需关心对象内部的实现细节
在js中,迭代器是一个符合迭代器协议的具体对象
迭代器协议 迭代器协议定义了产生一系列值(无论是有限个还是无限个)的标准方式
在js中,这个标准就是实现了一个特定的next方法:
一个简单的例子
在迭代过程中被return() 和 throw()方法中断,两个方法都应返回实现 IteratorResult 接口的对象
在迭代器中监听中断事件,在迭代器中实现return方法
for...of操作、展开运算符操作、yield、解构赋值new Set(iterable)、new Map(iterable)、new weakMap(iterable) 、new weakSet(iterable)Promise.all(iterable)、Promise.race(iterable)、promise.any(iterable),Array.from(iterable) 等特别注意:
在构建对象字面量时,也可以使用展开运算符,这个是在ES2018(ES9)中添加的新特性,而不是因为普通对象符合可迭代协议!!
所以不是在构建字面量对象的时候,对一个对象使用展开运算符,会报错
Array、Set、Map、String、arguments对象、NodeList等
生成器是一种函数控制、使用的方案,它可以让我们更加灵活的控制函数什么时候继续执行、暂停执行等
在js中,生成器是指由生成器函数返回的对象,它同时也一个特殊的迭代器,实现了迭代器协议 (即next方法),也是一个可迭代对象,实现可迭代协议
生成器函数也是一个函数,但与普通函数有一些区别:
function后面加符号: *yield关键词来控制函数的执行流程(普通函数不可以)Generator(生成器)--事实上是一种特殊的迭代器例子
next可以传递参数,在函数中通过yield前面定义的变量接收。yield之间的代码,并可以通过yield返回值,next方法,都会执行上一个yield后面都下一个yield或者return之间的语句return或者生成器调用return方法都可以终止生成器函数的继续执行return方法也可以传递参数,也可以使用throw方法传递一个错误来提前终结场景:自定义的迭代器完整实现太麻烦了,生成器函数可以简化迭代器的生成
yield* 语法糖yield* arr arr需要是一个可迭代对象,那么会自动迭代arr返回