ES6 - Iterator

遍历器(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配合使用,跳出循环。

你可能感兴趣的:(ES6 - Iterator)