是什么
一种接口,为各种不同的数据结构提供统一的访问机制。
任何数据结构只要部署Iterator
接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。
作用
- 为各种数据结构,提供一个统一的、简便的访问接口
- 使得数据结构的成员能够按某种次序排列
-
ES6
创造了一种新的遍历命令for...of
循环,Iterator
接口主要供for...of
消费
默认Iterator
接口
ES6
规定,默认的Iterator
接口部署在数据结构的Symbol.iterator
属性,或者说,一个数据结构只要具有Symbol.iterator
属性,就可以认为是“可遍历的”(iterable
)。Symbol.iterator
属性本身是一个函数,就是当前数据结构默认的遍历器生成函数。执行这个函数,就会返回一个遍历器。至于属性名Symbol.iterator
,它是一个表达式,返回Symbol
对象的iterator
属性,这是一个预定义好的、类型为 Symbol
的特殊值,所以要放在方括号内。
特征
- 根本特征:一种指针对象,具有
next
方法。每次调用next
方法,都会返回一个代表当前成员的信息对象,具有value
和done
两个属性。value
属性是当前成员的值,done
属性是一个布尔值,表示遍历是否结束。 - 除了具有
next
方法,还可以具有return
方法和throw
方法。- 如果自己写遍历器对象生成函数,
next
方法必须部署,return
和throw
方法可选部署。return()
方法必须返回一个对象,这是Generator
语法决定的。
return
方法的使用场合:-
for...of
循环提前退出(通常是因为出错,或者有break
语句) - 一个对象在完成遍历前,需要清理或释放资源
-
-
throw()
方法主要是配合Generator
函数使用,一般的遍历器对象用不到这个方法。
- 如果自己写遍历器对象生成函数,
最简单实现
使用 Generator 函数,只要用 yield
命令给出每一步的返回值即可。
let obj = {
* [Symbol.iterator]() {
yield 'hello';
yield 'world';
}
};
for (let x of obj) {
console.log(x);
}
内置类型
Array
Map
Set
String
TypedArray
- 函数的
arguments
对象 -
NodeList
对象
场景
- 解构赋值:默认调用
- 扩展运算符(...)
yield*
- 其他任何接受数组作为参数的场合
for...of
- Array.from()
Map(), Set(), WeakMap(), WeakSet()(比如new Map([['a',1],['b',2]]))
Promise.all()
Promise.race()