迭代器是 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()
方法,都返回对象当前成员的信息。具体来说,就说返回一个包含value
和done
两个属性的对象。其中,value
属性是当前成员的值,done
属性是一个布尔值,表示迭代是否完成。
参考
- 《深入浅出ES6》 by InfoQ
- 《ECMAScript 6入门》 by 阮一峰