Iterator
Iterator的作用有三个:一是为各种数据结构,提供一个统一的、简便的访问接口;二是使得数据结构的成员能够按某种次序排列;三是ES6创造了一种新的遍历命令for…of循环,Iterator接口主要供for…of消费
部署 Iterator 接口
数组、Map、Set、类数组都有部署 Iterator 的接口,但是对象并没有,下面展示如何为对象部署 Iterator 接口
|
|
上面的三个例子都有一个共同点,就是部署 Iterator 接口都是在对象的 Symbol.iterator
属性中返回一个对象,而该对象包含一个 next()
函数指明指针的运动逻辑,并返回 value
和 done
两个值。还有另外一个 return()
方法用于在中断遍历时的操作,必须返回一个对象。此外,也可以直接使用数组的 Iterator 作为对象的迭代器
|
|
注意,如果 Symbol.iterator
属性返回并不是一个迭代器的标准对象,那么会报错
|
|
Iterator 的使用场景
解构赋值
对数组的解构赋值默认会调用
Symbol.iterator
方法
|
|
扩展运算符
|
|
yield*
这个还没学到,不予评论,后面学到了再填坑
其他场景
- for…of
- Array.from()
- Map(), Set(), WeakMap(), WeakSet()(比如new Map([[‘a’,1],[‘b’,2]]))
- Promise.all()
- Promise.race()
- 字符串也部署了 Iterator 接口
for…of
- for…of 遍历数组,key 值保持为数字,而 for…in 会把 key 值变为字符串
- for…of 可以 break 或 return,而 forEach() 不可以
- for…of 可以正确识别 32 位 UTF-16 字符
以上实例代码大部分来自阮一峰老师的 《ECMAScript 6 入门》 一书
书籍在线阅读地址: http://es6.ruanyifeng.com/#README