Iterator和for...of循环
1.Iterator遍历器的概念
JS表示“集合”的数据结构有:Array,Object,Map,Set,这四种也可以组合使用。情况比较复杂,
需要一种统一的接口机制,来处理所有不同的数据结构--iterator遍历器就是。
任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。
Iterator的三个作用:
1.为各种数据结构,通过统一的、简便的访问接口;
2.使数据结构的成员能按照某种次序排列;
3.主要供ES6新的遍历命令for...of消费
遍历过程:具体略,主要点:遍历器对象(指针对象),next方法,返回value,done(布尔值,遍历是否结束)
![](https://img.haomeiwen.com/i5903053/8e413569a8ddd794.png)
2.默认Iterator接口
Iterator 接口的目的,就是为所有数据结构,提供了一种统一的访问机制,即for...of循环。当使用for...of循环遍历某种数据结构时,该循环会自动去寻找 Iterator 接口。
ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)
![](https://img.haomeiwen.com/i5903053/c9f8e15c4e04250c.png)
原生具备 Iterator 接口(即原生部署了Symbol.iterator属性)的数据结构如下:
![](https://img.haomeiwen.com/i5903053/bff6312bdccf983d.png)
其他原生不具备Iterator的数据结构(主要是Object),都需要自己在Symbol.iterator属性上面部署,例如上上图所示
对象(Object)之所以没有默认部署 Iterator 接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。本质上,遍历器是一种线性处理,对于任何非线性的数据结构,部署遍历器接口,就等于部署一种线性转换。
不过,严格地说,对象部署遍历器接口并不是很必要,因为这时对象实际上被当作 Map 结构使用,ES5 没有 Map 结构,而 ES6 原生提供了。
3.调用Iterator接口的场合
(1)解构赋值
(2)扩展运算符(...)
(3)yield*
![](https://img.haomeiwen.com/i5903053/0937c7a6b5508f85.png)
(4)其他场合
由于数组的遍历会调用遍历器接口,所以任何接受数组作为参数的场合,其实都调用了遍历器接口。下面是一些例子
![](https://img.haomeiwen.com/i5903053/c13a568402b51b5b.png)
4.字符串的Iterator接口
![](https://img.haomeiwen.com/i5903053/bb75c9215734b4ce.png)
5.Iterator接口和Generator函数
Symbol.iterator方法的最简单的实现就是使用Generator函数和yeild??先跳过,学了函数后再回顾
6.遍历器对象的return()、throw()
return():遍历没有都完成(可能是因为出错、有break语句、continue语句)时会执行,该方法必须返回一个对象(这是 Generator 规格决定的)
throw方法主要是配合 Generator 函数使用,一般的遍历器对象用不到这个方法。请参阅《Generator 函数》一章
7.for...of循环
![](https://img.haomeiwen.com/i5903053/53ab65aad914e98c.png)
与其他遍历语法的比较:
for
forEach--array(中途无法跳出循环)
for..in
![](https://img.haomeiwen.com/i5903053/a166b49b717d5d2a.png)
网友评论