• js 迭代器iterator 和 生成器Generator 10



    一、迭代器 iterator

    迭代器:是一个对象,帮助我们对某个数据结构进行遍历

    • 迭代器要符合迭代器协议,必须要有一个特定的next方法,返回一个对象,里面包括两个属性:done和value。done为false时,说明下面没有可迭代的了,value是任何js值

    迭代器的代码

    const friend =['1','2','3']
    
    let index =0
    const friendIterator = {
      next:function (){
        if(index<friend.length){
          return { done:false,value:friend[index++]}
        }else{
          return { done:true,value:undefined}
        }
      }
    }
    console.log(friendIterator.next())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 写迭代器的好处是什么呢? 其实 for of 操作时是不能迭代对象的,或者说对象不是可迭代的
    • 但是我们可以自己写个迭代器,让不可迭代对象变成可迭代的

    二、可迭代对象 @@interator

    可迭代对象: 当这个对象实现@interator 方法,在代码对象中我们可以使用Symbol.iterator
    好处: 当一个对象变成可迭代对象时,可以进行某些迭代操作

    可迭代对象的代码

    const info = {
      friend : ['1','2','3'],
      [Symbol.iterator]:function (){
        let index =0
        return {
          next:function (){
            if(index<friend.length){
              return { done:false,value:friend[index++]}
            }else{
              return { done:true,value:undefined}
            }
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    可迭代对象的应用

    1. js 语法: for of 、展开语法、 yield* 、结构赋值
    2. 创造一些对象时: new Map 、 newWeakMap、 new Set 、 newWeakSet
    3. 一些方法的调用: promise (all , race ) 、 array.form
    4. 自定义类

    三、 生成器

    1. 生成器是ES6中新增的一种函数控制、使用的方案,它可以让我们更加灵活的控制函数什么时候继续执行、暂停执行等。
    2. 平时我们会编写很多的函数,这些函数终止的条件通常是返回值或者发生了异常

    生成器函数也是一个函数,但是和普通的函数有一些区别:

    1. 首先,生成器函数需要在function的后面加一个符号:*
    2. 其次,生成器函数可以通过yield关键字来控制函数的执行流程:
    3. 最后,生成器函数的返回值是一个Generator(生成器):
    4. 生成器事实上是一种特殊的迭代器

    生成器代码

    function* foo() {
      console.log('函数开始执行了')
      const value1 = 100
      yield value1
    
      const value2 = 200
      yield value2
    
      const value3 = 300
      yield value3
    
      console.log('函数执行完毕')
    }
    
    
    
    const generator = foo()
    
    // 执行到第一个并暂停执行
    console.log(generator.next())
    // 执行到第二个并暂停执行
    console.log(generator.next())
    // 执行到第三个并暂停执行
    console.log(generator.next())
    // 执行剩余代码
    console.log(generator.next())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 会发现foo函数并不是立即执行,而是会返回一个生成器对象,通过next 控制执行

    生成器传递参数 – next函数

    • 我们在调用next函数的时候,可以给它传递参数,那么这个参数会作为上一个yield语句的返回值
    • 也就是说我们是为本次的函数代码块执行提供了一个值
    function* foo(initial) {
       console.log("函数开始执行~")
       const valuel = yield initial + "aaa"
       const value2 = yield valuel + "bbb"
       const value3 = yield value2 + "ccc"
    }
    const generator = foo("why")
    const result1 = generator.next()
    console.log("result1:", result1)
    const result2 = generator.next(result1.value)
    console.log("result2:",result2)
    const result3 = generator.next(result2.value)
    console.log("result3:",result3)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    最小生成树(Prim普利姆算法、Kruskal克鲁斯卡尔算法)
    【C】高并发线程池设计
    vue-router实现history模式配置(生产环境路由失效跟刷新404问题)
    ERROR [main] regionserver.HRegionServer: Failed construction RegionServer
    控制器功能端口说明
    流式结构化数据计算语言的进化与新选择
    用php&&redis发布订阅模式实现批量发送短信
    机器学习-sklearn-高斯混合模型-学习笔记
    视频图像处理算法opencv模块硬件设计图像颜色识别模块
    pandas 怎么样扩展数据,就是把加权数据,转换成个案数据
  • 原文地址:https://blog.csdn.net/m0_47186697/article/details/134481068