小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2024-04-06 / 5 阅读
0
0

JavaScript迭代器和生成器

在JavaScript中,迭代器(Iterator)和生成器(Generator)也是处理异步编程和迭代过程的重要概念:

迭代器(Iterator)

  • 定义:JavaScript中的迭代器是一个实现了迭代器协议的对象,这意味着它有一个 next()方法,该方法每次调用都会返回一个包含两个属性的对象:value(迭代得到的当前值)和 done(布尔值,表示是否已到达迭代终点)。如果 donetrue,则表示迭代完成,value通常不重要;若 donefalse,则 value是当前元素的值。

例如,数组、Set、Map等原生类型都内置了迭代器支持,可以通过 Symbol.iterator属性直接获取其迭代器:

let arr = [1, 2, 3];
let iter = arr[Symbol.iterator]();
console.log(iter.next()); // { value: 1, done: false }
console.log(iter.next()); // { value: 2, done: false }
console.log(iter.next()); // { value: 3, done: false }
console.log(iter.next()); // { value: undefined, done: true }

生成器(Generator)

  • 定义:生成器是JavaScript ES6引入的一种特殊的迭代器生成函数。它通过使用 function*定义,并在函数内部使用 yield关键字来暂停和恢复函数执行,从而能够逐次产生一系列的值。

生成器函数在每次调用 next()方法时,会在上次暂停的地方继续执行直到遇到下一个 yield表达式,然后返回一个新的迭代结果。

function* generatorExample() {
  yield 'a';
  yield 'b';
  yield 'c';
}

let gen = generatorExample();
console.log(gen.next()); // { value: 'a', done: false }
console.log(gen.next()); // { value: 'b', done: false }
console.log(gen.next()); // { value: 'c', done: false }
console.log(gen.next()); // { value: undefined, done: true }
  • 特点:生成器不仅可以用来生成一系列值,还可以接收外部传入的数据(通过调用 next()时传入的参数),这使得它们非常适合用于复杂的异步控制流程,比如配合 async/await语法处理异步操作。

因此,相对于普通迭代器,生成器提供了更强大的功能,它不仅能迭代一组固定的或动态生成的值,还能保存状态并在后续调用中恢复执行上下文,这对于实现协程、异步任务管理以及流处理等功能尤为有用。

详见:迭代器和生成器 - JavaScript | MDN (mozilla.org)


评论