ES6之迭代器与for...of循环

迭代器是 ES6 种非常特殊的一个东西。

Iterator(迭代器)

Iterator是一种接口,为各种不同的数据结构提供了统一的访问机制,即for...of循环。任何数据结构只要部署了Iterator接口,就可以完成遍历操作,即依次访问该数据结构的所有成员。

ES6规定,默认的Iterator接口部署在对象的Symbol.iterator属性。这些拥有Symbol.iterator的对象被称为可迭代的。在ES6中,有四类数据结构原生具有Symbol.iterator属性,可以直接使用for...of循环进行迭代操作:数组、某些类数组对象、Set和Map。

如果想让一个对象可以被for...of循环遍历,就必须在其Symbol.iterator属性上部署迭代器生成方法(原型链上的对象具有该方法也可)。

for…of循环

ES6之前,JavaScript中只有for...in 循环,但是这个循环不仅缺点多多,而且本质上是遍历对象属性的键名,所以无法用来遍历数组等非普通对象的数据结构。

现在,横空出世的for...of 循环改变了这一混乱现状,它不仅支持遍历数组,而且还支持大多数类数组对象,当然,同样支持Set和Map。

这种遍历的背后原理是:for...of循环首先会调用部署在对象Symbol.iterator属性上的方法,紧接着返回一个新的迭代器对象。迭代器对象可以是任意具有.next() 方法的对象;然后for...of循环将重复调用这个方法,将指针逐次移向对象的下一个成员。

每一次调用.next()方法,都返回对象当前成员的信息。具体来说,就说返回一个包含valuedone 两个属性的对象。其中,value属性是当前成员的值,done 属性是一个布尔值,表示迭代是否完成。


参考