迭代器和生成器

本文最后更新于:9 个月前

迭代器和生成器

迭代器是什么?

  在 javascript 中国呢,迭代器是一个对象。他定义了一个序列,并在终止时可能返回一个返回值。迭代器通过使用一个next()来实现可迭代协议,对象可以自定义他们自己的迭代行为,比如在一个 for..of 中哪些值可以被便利到,在现有的类型中 array、Map、WeakMap 和 String 都有默认的迭代行为,是一个内置可迭代对象。但是 Object 就不行,他不是可迭代对的。要可迭代,那么他必须实现一个@@iterator方法(一个无参数的函数,其返回值为一个符合迭代器协议的对象)
  当迭代器创建之后,就可以通过重读的调用 next()来显式的迭代,当到结束位置后,next()返回{done:true}表示已经迭代完成了,也是消耗完了此次的迭代器,因为迭代一般就执行一次。

function makeIterator(start = 0, end = 100, step = 1) {
  let iteratorCount = 0;
  return {
    next: function () {
      if (start < end) {
          let res = { value: start, done: false };
          start += step;
          iteratorCount++;
          return res;
      } else {
        return { value: iteratorCount, done: true };
      }
    }
  };
}
let iterator = makeIterator(0,10,1);
let target = iterator.next();
while(!target.done){
    console.log(target.value);
    target = iterator.next();
}

生成器?

  生成器允许你定义一个包含自有迭代算法的函数, 同时它可以自动维护自己的状态。 生成器函数使用 function*语法编写。 最初调用时,生成器函数不执行任何代码,而是返回一种称为Generator的迭代器。 通过调用生成器的下一个方法消耗值时,Generator函数将执行,直到遇到yield关键字。

function* makeRangeIterator(start = 0, end = Infinity, step = 1) {
    for (let i = start; i < end; i += step) {
        yield i;
    }
}
var a = makeRangeIterator(1,10,2)
a.next() // {value: 1, done: false}
a.next() // {value: 3, done: false}
a.next() // {value: 5, done: false}
a.next() // {value: 7, done: false}
a.next() // {value: 9, done: false}
a.next() // {value: undefined, done: true}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!