Iterator
Iterator
(遍历器、迭代器) 是一个对象,Iterator对象需要包含一个next
方法,该方法返回一个对象IteratorObject
,此对象有两个属性,一个value表示当前结果,一个done
是一个布尔值表示是否可以继续迭代
let it = makeIterator();
function makeIterator() {
let nextIndex = 0;
return {
next: function() {
return nextIndex < 5 ?
{value: nextIndex++, done: false} :
{value: undefined, done: true};
}
};
}
- ES6 规定,如果数据结构的
Symbol.iterator
属性是一个方法,该方法返回Iterator
对象,就可以认为此数据结构是“可遍历的”(iterable
)
interface Iterable {
[Symbol.iterator]() : Iterator,
}
interface Iterator {
next(value?: any) : IterationResult,
}
interface IterationResult {
value: any,
done: boolean,
}
可迭代协议
迭代器协议定义了产生一系列值(无论是有限个还是无限个)的标准方式。当值为有限个时,所有的值都被迭代完毕后,则会返回一个默认返回值。
- ES6中以下场合会默认调用
Iterator
接口(即Symbol.iterator
方法),
- for…of循环
- 数组解构
- 扩展运算符
- yield*
- 其他隐式调用的地方,例如
new Set(['a','b']),Promise.all()
等
- ES6中以下数据结构默认为可遍历对象,即默认部署了
Symbol.iterator
属性
- Array
- Map
- Set
- String
- 函数的 arguments 对象
- NodeList 对象
let str = 'abc'
console.log(str[Symbol.iterator])
//ƒ [Symbol.iterator]() { [native code] }
提前终止迭代器
可选的return方法用于指定在迭代器提前关闭时执行逻辑。
- for-of循环通过break、continue、return或throw提前退出
- 数组的迭代器就是不能关闭的