generator与iterator

105 阅读2分钟

常见数组的7种遍历方法

forEach:普通的数组遍历方法

map: 映射,每遍历一次,返回一个数组元素,最终返回一个新数组

filter: 过滤,每一次遍历,返回布尔值来决定当前元素是否纳入一个新的数组

reduce: 归纳,每一次遍历,将当前元素收纳入容器中

reduceRight: reduce的反向操作

every: 判断是否所有元素都符合一个条件,返回布尔值

some: 判读是否有一个或多个符合一个条件,返回布尔值

Generator

生成器对象是由一个generator function返回的,并且它符合可迭代协议和迭代器协议。 function* 这种声明方式(function关键字后跟一个星号)会定义一个生成器函数(generator function) ,它返回一个Generator 对象。

截屏2022-02-08 下午11.15.34.png

生成器函数在执行时能暂停,后面又能从暂停处继续执行。调用一个生成器函数并不会马上执行它里面的语句,而是返回一个这个生成器的 迭代器( iterator )对象。当这个迭代器的 next() 方法被首次(后续)调用时,其内的语句会执行到第一个(后续)出现yield的位置为止,yield 后紧跟迭代器要返回的值。或者如果用的是 yield*(多了个星号),则表示将执行权移交给另一个生成器函数(当前生成器暂停执行)。

next()方法返回一个对象,这个对象包含两个属性:value 和 done,value 属性表示本次 yield 表达式的返回值,done 属性为布尔类型,表示生成器后续是否还有 yield 语句,即生成器函数是否已经执行完毕并返回。

Iterator

迭代协议具体分为两个协议:可迭代协议和迭代器协议。

可迭代协议允许 JavaScript 对象定义或定制它们的迭代行为,例如,在一个 for..of 结构中,哪些值可以被遍历到。一些内置类型同时是内置可迭代对象,并且有默认的迭代行为,比如 Array 或者 Map,而其他内置类型则不是(比如 Object))。

要成为可迭代对象, 一个对象必须实现 @@iterator 方法。这意味着对象(或者它原型链上的某个对象)必须有一个键为 @@iterator 的属性,可通过常量 Symbol.iterator 访问该属性。

迭代器协议定义了产生一系列值(无论是有限个还是无限个)的标准方式。当值为有限个时,所有的值都被迭代完毕后,则会返回一个默认返回值。

generator与iterator实现

生成器迭代器返回的函数有一个next方法,next方法返回一个对象,键值包括value和done

function gen(arr) {
    var nextIndex = 0
    
    return {
        next: function() {
            return nextIndex < arr.length ? 
                {
                    value: arr[nextIndex++],
                    done: false
                }
                :
                {
                    value: arr[nextIndex++],
                    done: true
                }
           }
      }
  }