javascript

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

2022-04-12  本文已影响0人  飞天小猪_pig

如何理解什么是迭代器,先理解下面一段代码,每一次执行函数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){}  //可迭代对象,迭代是一个一个访问,有停顿的
上一篇下一篇

猜你喜欢

热点阅读