2018-01-19 ES6 阮一峰教程摘记11 遍历方法

2018-09-10  本文已影响0人  安乐_f487

Iterator和for...of循环

1.Iterator遍历器的概念

JS表示“集合”的数据结构有:Array,Object,Map,Set,这四种也可以组合使用。情况比较复杂,

需要一种统一的接口机制,来处理所有不同的数据结构--iterator遍历器就是。

任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。

Iterator的三个作用:

1.为各种数据结构,通过统一的、简便的访问接口;

2.使数据结构的成员能按照某种次序排列;

3.主要供ES6新的遍历命令for...of消费

遍历过程:具体略,主要点:遍历器对象(指针对象),next方法,返回value,done(布尔值,遍历是否结束)

模拟遍历过程的例子

2.默认Iterator接口

Iterator 接口的目的,就是为所有数据结构,提供了一种统一的访问机制,即for...of循环。当使用for...of循环遍历某种数据结构时,该循环会自动去寻找 Iterator 接口。

ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)

Symbol.iterator属性

原生具备 Iterator 接口(即原生部署了Symbol.iterator属性)的数据结构如下:

原生具备Iterator的数据结构

其他原生不具备Iterator的数据结构(主要是Object),都需要自己在Symbol.iterator属性上面部署,例如上上图所示

对象(Object)之所以没有默认部署 Iterator 接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。本质上,遍历器是一种线性处理,对于任何非线性的数据结构,部署遍历器接口,就等于部署一种线性转换。

不过,严格地说,对象部署遍历器接口并不是很必要,因为这时对象实际上被当作 Map 结构使用,ES5 没有 Map 结构,而 ES6 原生提供了。

3.调用Iterator接口的场合

(1)解构赋值

(2)扩展运算符(...)

(3)yield*

(4)其他场合

由于数组的遍历会调用遍历器接口,所以任何接受数组作为参数的场合,其实都调用了遍历器接口。下面是一些例子

4.字符串的Iterator接口

5.Iterator接口和Generator函数

Symbol.iterator方法的最简单的实现就是使用Generator函数和yeild??先跳过,学了函数后再回顾

6.遍历器对象的return()、throw()

return():遍历没有都完成(可能是因为出错、有break语句、continue语句)时会执行,该方法必须返回一个对象(这是 Generator 规格决定的)

throw方法主要是配合 Generator 函数使用,一般的遍历器对象用不到这个方法。请参阅《Generator 函数》一章

7.for...of循环

与其他遍历语法的比较:

for

forEach--array(中途无法跳出循环)

for..in

上一篇下一篇

猜你喜欢

热点阅读