遍历器(Iterator)是为各种不同的数据结构提供统一的访问机制的一种接口
任何数据结构只要部署 Iterator 接口,就可以完成遍历操作
一种数据结构只要部署了 Iterator 接口,我们就称这种数据结构是“可遍历的”(iterable)
默认 Iterator 接口
ES6 规定,默认的 Iterator 接口部署在数据结构的 Symbol.iterator 属性
Symbol.iterator 属性本身是一个函数,就是当前数据结构默认的遍历器生成函数
执行这个函数,会返回一个遍历器对象。该对象的根本特征就是具有 next 方法。每次调用 next 方法,都会返回一个代表当前成员的信息对象,具有 value 和 done 两个属性:
const obj = {
[Symbol.iterator] : function () {
return {
next: function () {
return { value: 1, done: true };
}
};
}
};
ES6 的有些数据结构原生具备 Iterator 接口:
Array
Map
Set
String
函数的 arguments 对象
NodeList 对象
如果给类数组对象部署 Iterator 接口,可以直接引用数组的 Iterator 接口:
let iterable = {
0: 'a',
1: 'b',
2: 'c',
length: 3,
[Symbol.iterator]: Array.prototype[Symbol.iterator]
};
调用 Iterator 接口的场合
for...of
...
yield*
Array.from()
Map() , Set()
Promise.all() , Promise.race()
由于数组的遍历会调用遍历器接口,所以任何接受数组作为参数的场合,其实都调用了遍历器接口
Iterator 接口与 Generator 函数
for...of 循环
ES6 借鉴其它语言,引入了 for...of 循环,作为遍历所有数据结构的统一的方法。一个数据结构只要部署了Symbol.iterator属性,就可以用for...of循环遍历它的成员。
与其他遍历语法的比较:
forEach:中途无法跳出循环。
for...in:为遍历对象而设计,会遍历数字键名以外的键,包括原型链上的键。
for...of 没有上述缺点,它可以与break、continue和return配合使用,跳出循环。