美文网首页javascript
ES6(5)、迭代器和生成器

ES6(5)、迭代器和生成器

作者: 飞天小猪_pig | 来源:发表于2022-04-12 01:25 被阅读0次

    如何理解什么是迭代器,先理解下面一段代码,每一次执行函数publish,version值就会增加一次,这好比我们要发布一个软件或者APP、当我们需要更新软件时候,下次发布的版本就会覆盖前面发布的,每一次发布就形成一次迭代。

    var version=0
    function publish(){
      version +=1
      return version
    }
    publish() // 1
    publish() // 2
    
    1、迭代器

    迭代器接受一个next方法,并返回一个value和done,当迭代到最后一个值时候,done则为true。
    (1)、

    function 发布器(){
       return {
          next:function(){}
        }
    }
    
    1

    (2)、

    function 发布器(){
       var _value=0
       return {
          next:function(){
              _value+=1
              return{
                   value:_value
               }
          }
        }
    }
    
    2

    (3)、实现迭代器

     function 发布器(){
       var _value=0
       var max=3
       return {
          next:function(){
              _value+=1
              if(_value>max){throw new Error('已经没有下一个了')}
              if(_value===max){
                  return {value:_value,done:true}
               }else{
                  return{
                        value:_value,
                        done:false
                  }
              }
          }
        }
    }
    
    3
    2、生成器

    生成器相当于迭代器的一个语法糖存在,生成器函数使用 function*语法编写。 通过调用生成器的下一个方法消耗值时,Generator函数将执行,直到遇到yield关键字。

    上述代码可以改下如下:

    function* 发布器(){
       var version=0
       while(true){
           version +=1
           yield version  //相当停顿一次,直到下一次调用这个方法
       }  
    }
    
    4

    (1)、可迭代对象

    若一个对象拥有迭代行为,比如在 for...of中会循环哪些值,那么那个对象便是一个可迭代对象。如 ArrayMap 拥有默认的迭代行为,而其他类型(比如Object)则没有。

    array=[1,2,3]
    object={a:1,b:2,c:3}
    for(let key of array){
      console.log(key)  //1,2,3
    }   
    for(let key of object){
      console.log(key)  //报错:object is not iterable
    }
    
    array[Symbol.iterator]   //f values(){[native code]} ,说明array有迭代方法
    object[Symbol.iterator]     //undefined ,object说明没有迭代方法
    

    上述例子说明,由于object不存在Symbol.iterator方法,所以不能进行迭代,也就不能进行 for...of操作,那怎么让一个对象可以进行迭代呢???

    object={a:1,b:2,c:3}
    object[Symbol.iterator]=function *(){   //让对象可迭代
      let keys=Object.keys(object)
      for(let i=0;i<keys.length;i++){
        yield object[keys[i]]
      }
    }
    
    for(let value of object){   //对象可以用for...of 了
      console.log(value)   //打印出1,2,3
    }
    

    拓展一下:

    for(let i=0;i<10;i++){}; //普通for循环
    for(let key in object){}  // 遍历一个对象,没有停顿
    for(let item of iterableObject){}  //可迭代对象,迭代是一个一个访问,有停顿的
    

    相关文章

      网友评论

        本文标题:ES6(5)、迭代器和生成器

        本文链接:https://www.haomeiwen.com/subject/hozisrtx.html