迭代器和生成器函数(generator)

迭代器

在js中,迭代器是一个对象,它定义一个序列,并在终止时可能附带一个返回值.

迭代器是通过next()方法实现迭代器协议的任何一个对象,该方法返回具有两个属性的对象:
value:迭代序列的下一个值
done:如果已经迭代到序列中的最后一个值,则它为 true。如果 value 和 done 一起出现,则它就是迭代器的返回值。

一旦创建,迭代器对象可以通过重复调用 next() 显式地迭代。迭代一个迭代器被称为消耗了这个迭代器,因为它通常只能执行一次:在产生终值后,对 next() 的额外调用应该继续返回 {done:true}。

例:范围迭代器

  • 定义从[start,end),步长step的序列
function makeRangeIterator(start = 0, end = Infinity, step = 1) {
  let nextIndex = start;
  let iterationCount = 0;

  const rangeIterator = {
    next() {
      let result;
      if (nextIndex < end) {
        result = { value: nextIndex, done: false };
        nextIndex += step;
        iterationCount++;
        return result;
      }
      return { value: iterationCount, done: true };
    },
  };
  return rangeIterator;
}
  • 使用迭代器
let it = makeRangeIterator(1, 10, 2);

let result = it.next();
while (!result.done) {
  console.log(result.value); // 1 3 5 7 9
  result = it.next();
}
console.log(`已迭代序列的大小:${result.value}`); // 5

生成迭代器

生成器函数(Generator 函数)提供了一个强大的替代选择:它允许你定义一个非连续执行的函数作为迭代算法。生成器函数使用 function* 语法编写。

function* 是 JavaScript 中用来定义生成器函数(Generator Function)的语法。生成器函数是一种特殊类型的函数,可以暂停执行并在稍后的时间继续执行。它们通过使用 yield 关键字来产生(yield)一个值,并且在产生值后会暂停执行,等待下一次的调用继续执行

function* makeRangeIterator(start = 0, end = Infinity, step = 1) {
  let iterationCount = 0;
  for (let i = start; i < end; i += step) {
    iterationCount++;
    yield i;
  }
  return iterationCount;
}

当生成器函数被调用时,它会返回一个生成器对象,该对象可以通过调用 next() 方法来控制生成器函数的执行。每次调用 next() 方法时,生成器函数会从上一次暂停的地方继续执行,直到遇到下一个 yield 关键字,再次产生一个值并暂停执行。

斐波那契数列

var fibGenerator = function*() {
    let pre =0,
    cur =1;
    yield pre
    yield cur
    while(true){
        yield pre + cur;
        [pre,cur] = [cur,pre+cur]
    }
};
//使用
 const gen = fibGenerator();
 gen.next().value; // 0
 gen.next().value; // 1
  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值