1 理解迭代
在 JavaScript 中,计数循环就是一种简单的迭代

循环是迭代机制的基础,因为它可以指定迭代的次数,以及每次迭代要执行什么操作。每次循环都会在下一次迭代开始之前完成,而每次迭代的顺序都是事先定义好的
迭代会在一个有序集合上进行,"有序"可以理解为集合所有项都可以按照既定的顺序被遍历到,数组就是 JavaScript 中有序集合的最典型例子

通过这样的循环来执行存在以下问题:
1)迭代之前需要事先知道如何使用数据结构。数组中的每一项都只能先通过引用取得数组对象,通过 [] 操作符取得特定索引位置上的项,这种情况并不适用于所有数据结构
2)遍历顺序并不是数据结构固有的。通过递增索引来访问数据是特定于数组类型的方式,并不适用于其他具有隐式顺序的数据结构
ES5新增了 Array.prototype.forEach() 方法,这解决了单独记录索引和通过数组对象取得值的问题,但没办法标识迭代何时终止,因此这只适用于数组
很多语言通过原生语言结构解决了这个问题,我们无须事先知道如何迭代就能实现迭代操作,这个解决方案就是迭代器模式,ES6也支持了迭代器模式
2 迭代器模式
迭代器模式把有些结构称为"可迭代对象",因为它们实现了正式的 Iterable 接口,可以通过迭代器来逐一访问其中的元素
可迭代对象并不仅仅是数组或集合,它指的是任何可以通过某种遍历机制访问其元素的数据结构,这些元素是有限的,并且具有明确的遍历顺序,比如最开始提到的计数循环。该循环中生成的值是暂时性的,但循环本身是在执行迭代,计数循环和数组都具有可迭代对象的行为
PS:临时性可迭代对象可以实现为生成器
2.1 可迭代协议
实现 Iterable 接口(可迭代协议)意味着必须暴露一个属性作为"默认迭代器",而且这个属性必须使用特殊的 Symbol.iterator 作为键。这个默认迭代器属性必须引用一个迭代器工厂函数,调用这个工厂函数必须返回一个新迭代器

很多内置类型都实现了 Iterable 接口:字符串、数组、映射、集合、arguments对象、NodeList等 DOM 集合

最低0.47元/天 解锁文章
1532

被折叠的 条评论
为什么被折叠?



