第7章 迭代器与生成器

目录

7.1 理解迭代

7.2 迭代器模式

7.2.1 可迭代协议

7.2.2 迭代器协议

7.2.3 自定义迭代器

 7.2.4 提前终止迭代器

7.3 生成器

7.3.1 生成器基础

7.3.2 通过yield中断执行

7.3.3 生成器作为默认迭代器

7.3.4 提前终止生成器

7.4 小结


7.1 理解迭代

循环是迭代机制的基础,这是因为它可以指定迭代的次数,以及每次迭代要执行什么操作。每次循环都会在下一次迭代开始之前完成,而每次迭代的顺序都是事先定义好的。

7.2 迭代器模式

迭代器模式(特别是在ECMAScript这个语境下)描述了一个方案,即可以把有些结构称为“可迭代对象”(iterable),因为它们实现了正式的Iterable接口,而且可以通过迭代器Iterator消费。

7.2.1 可迭代协议

要求:

  • 支持迭代的自我识别能力
  • 创建实现Iterator接口的对象的能力

很多内置类型都实现了Iterable接口:

  • 字符串
  • 数组
  • 映射
  • 集合
  • arguments对象
  • NodeList等DOM集合类型

7.2.2 迭代器协议

迭代器是一种一次性使用的对象,用于迭代与其关联的可迭代对象。

迭代器API使用next()方法在可迭代对象中遍历数据。例如:

 不同迭代器的实例相互之间没有联系,只会独立地遍历可迭代对象。

7.2.3 自定义迭代器

与Iterable接口类似,任何实现Iterator接口的对象都可以作为迭代器使用。

 7.2.4 提前终止迭代器

可选的return()方法用于指定在迭代器提前关闭时执行的逻辑。执行迭代的结构在想让迭代器知道它不想遍历到可迭代对象耗尽时,就可以“关闭”迭代器。可能的情况包括:

  •  for-of循环通过break、continue、return或throw提前退出;
  • 解构操作并未消费所有值。

7.3 生成器

拥有在一个函数块内暂停和恢复代码执行的能力。

7.3.1 生成器基础

生成器的形式是一个函数,函数名称前面加一个星号(*)表示它是一个生成器。只要是可以定义函数的地方,就可以定义生成器。

 注意 箭头函数不能用来定义生成器函数。

与迭代器相似,生成器对象也实现了Iterator接口,因此具有next()方法。

7.3.2 通过yield中断执行

yield关键字可以让生成器停止和开始执行,也是生成器最有用的地方。

7.3.3 生成器作为默认迭代器

因为生成器对象实现了Iterable接口,而且生成器函数和默认迭代器被调用之后都产生迭代器,所以生成器格外适合作为默认迭代器。

7.3.4 提前终止生成器

return()和throw()方法都可以用于强制生成器进入关闭状态。

7.4 小结

  1. 迭代器是一个可以由任意对象实现的接口,支持连续获取对象产出的每一个值。任何实现Iterable接口的对象都有一个Symbol.iterator属性,这个属性引用默认迭代器。默认迭代器就像一个迭代器工厂,也就是一个函数,调用之后会产生一个实现Iterator接口的对象。
  2. 迭代器必须通过连续调用next()方法才能连续取得值,这个方法返回一个IteratorObject。这个对象包含一个done属性和一个value属性。前者是一个布尔值,表示是否还有更多值可以访问;后者包含迭代器返回的当前值。这个接口可以通过手动反复调用next()方法来消费,也可以通过原生消费者,比如for-of循环来自动消费。
  3. 生成器是一种特殊的函数,调用之后会返回一个生成器对象。生成器对象实现了Iterable接口,因此可用在任何消费可迭代对象的地方。生成器的独特之处在于支持yield关键字,这个关键字能够暂停执行生成器函数。使用yield关键字还可以通过next()方法接收输入和产生输出。在加上星号之后,yield关键字可以将跟在它后面的可迭代对象序列化为一连串值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值