返回

JavaScript 中的生成器使用指南(上)

前端

简介

生成器是 JavaScript 中的一项强大特性,它允许您创建可暂停和恢复的函数,从而生成一系列值。生成器通过 yield 实现,它充当一个检查点,允许函数在需要时暂停执行并返回一个值。

语法

生成器函数与普通函数的语法略有不同。您需要在函数声明前添加一个星号 * 来声明一个生成器函数:

function* myGenerator() {
  // 生成器函数主体
}

使用

要使用生成器,您需要调用该函数并将其分配给一个变量。该变量将保存指向生成器对象的引用。

const generator = myGenerator();

然后,您可以使用 next() 方法从生成器中获取值。 next() 方法返回一个对象,其中包含两个属性:

  • value:生成器当前返回的值
  • done:一个布尔值,指示生成器是否已完成
const result = generator.next();
console.log(result.value); // 输出生成器返回的第一个值

您可以继续调用 next() 方法来获取生成器中的后续值,直到 done 属性为 true,表示生成器已完成。

与默认迭代器的关系

生成器与默认迭代器密切相关。实际上,每个生成器都是一个迭代器。您可以使用 for...of 循环遍历生成器:

for (const value of myGenerator()) {
  console.log(value);
}

使用场景

生成器在各种场景中都非常有用,包括:

  • 生成一序列的值,例如斐波那契数列
  • 暂停和恢复长时间运行的操作,例如文件读取
  • 创建可迭代的对象,例如链表

示例

生成斐波那契数列:

function* fibonacci() {
  let [prev, curr] = [0, 1];
  while (true) {
    yield curr;
    [prev, curr] = [curr, prev + curr];
  }
}

使用 yield 暂停函数执行:

function* readFile() {
  const file = yield fetch('file.txt');
  const contents = yield file.text();
  return contents;
}

for...of 循环中使用生成器:

const myList = [1, 2, 3, 4, 5];

for (const value of myList) {
  console.log(value);
}