JavaScript基础 -- 迭代器与生成器

1 理解迭代

在 JavaScript 中,计数循环就是一种简单的迭代
在这里插入图片描述
循环是迭代机制的基础,因为它可以指定迭代的次数,以及每次迭代要执行什么操作。每次循环都会在下一次迭代开始之前完成,而每次迭代的顺序都是事先定义好的

迭代会在一个有序集合上进行,"有序"可以理解为集合所有项都可以按照既定的顺序被遍历到,数组就是 JavaScript 中有序集合的最典型例子
在这里插入图片描述

通过这样的循环来执行存在以下问题:

1)迭代之前需要事先知道如何使用数据结构。数组中的每一项都只能先通过引用取得数组对象,通过 [] 操作符取得特定索引位置上的项,这种情况并不适用于所有数据结构

2)遍历顺序并不是数据结构固有的。通过递增索引来访问数据是特定于数组类型的方式,并不适用于其他具有隐式顺序的数据结构

ES5新增了 Array.prototype.forEach() 方法,这解决了单独记录索引和通过数组对象取得值的问题,但没办法标识迭代何时终止,因此这只适用于数组

很多语言通过原生语言结构解决了这个问题,我们无须事先知道如何迭代就能实现迭代操作,这个解决方案就是迭代器模式,ES6也支持了迭代器模式

2 迭代器模式

迭代器模式把有些结构称为"可迭代对象",因为它们实现了正式的 Iterable 接口,可以通过迭代器来逐一访问其中的元素

可迭代对象并不仅仅是数组或集合,它指的是任何可以通过某种遍历机制访问其元素的数据结构,这些元素是有限的,并且具有明确的遍历顺序,比如最开始提到的计数循环。该循环中生成的值是暂时性的,但循环本身是在执行迭代,计数循环和数组都具有可迭代对象的行为

PS:临时性可迭代对象可以实现为生成器

2.1 可迭代协议

实现 Iterable 接口(可迭代协议)意味着必须暴露一个属性作为"默认迭代器",而且这个属性必须使用特殊的 Symbol.iterator 作为键。这个默认迭代器属性必须引用一个迭代器工厂函数,调用这个工厂函数必须返回一个新迭代器
在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值