js 生成器和迭代器

本文介绍了JavaScript中的生成器和迭代器,包括迭代器的概念、生成器的使用、yield关键字的作用、yield*的委托以及异步生成器的特性。通过经典斐波那契数列示例和异步操作,阐述了生成器如何结合async/await进行工作,并提供了使用示例。
摘要由CSDN通过智能技术生成

JS生成器和迭代器

迭代器

为什么会说到这个呢?原因就是从扩展运算符和for…of的使用中发现这个问题的

let b = [1,2,3,4]
Math.max(...b)
=>4
let a ={
   1:2,5:6,8:9}
Math.max(...a)
=>Uncaught TypeError: a is not iterable

嗯,我们从提示上知道a并不是可迭代的,那怎么做呢?看一下数组上的原型方法

在这里插入图片描述
MDN对于迭代器的描述:

在 JavaScript 中,迭代器是一个对象,它定义一个序列,并在终止时可能返回一个返回值。 更具体地说,迭代器是通过使用 next() 方法实现 Iterator protocol 的任何一个对象,该方法返回具有两个属性的对象: value,这是序列中的 next 值;和 done ,如果已经迭代到序列中的最后一个值,则它为 true 。如果 valuedone 一起存在,则它是迭代器的返回值。

a[Symbol.iterator]=function(){
   
  let keys = Object.keys(a);
  let len = keys.length;
  let values = Object.values(a);
  let n = 0;
  return {
   
    next: function() {
   
        if (n < len) {
   
          return {
   
            value: {
   k: keys[n], v: values[n++]},
            done: false
          }
        } else {
   
          return {
   
	          done: true // 注意,一旦 done 为 true ,此时的 value 不返回
        }
      }
    }
  }
}
// 此时打印
console.log(...a)
=>Object {
    k: "1", v: 2 }
Object {
    k: "5", v: 6 }
Object {
    k: "8", v: 9 }

StringArrayTypedArrayMapSet 都是内置可迭代对象,因为它们的原型对象都拥有一个

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值