生成器

Generator 对象由 生成器函数 返回,它符合 可迭代协议迭代器协议

Generator 是隐藏的 Iterator 类的子类。

试用

构造函数

没有与 Generator 构造函数相对应的 JavaScript 实体。Generator 的实例必须从 生成器函数 返回。

js
function* generator() {
  yield 1;
  yield 2;
  yield 3;
}

const gen = generator(); // "Generator { }"

console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3

只有一个隐藏对象,它是所有由生成器函数创建的对象共享的原型对象。这个对象通常被写成 Generator.prototype 以使其看起来像一个类,但它应该更恰当地称为 GeneratorFunction.prototype.prototype,因为 GeneratorFunction 是一个实际的 JavaScript 实体。要了解 Generator 实例的原型链,请参见 GeneratorFunction.prototype.prototype

实例属性

这些属性在 Generator.prototype 上定义,并由所有 Generator 实例共享。

Generator.prototype.constructor

创建实例对象的构造函数。对于 Generator 实例,初始值为 GeneratorFunction.prototype

注意:Generator 对象不存储对创建它们的生成器函数的引用。

Generator.prototype[Symbol.toStringTag]

[Symbol.toStringTag] 属性的初始值为字符串 "Generator"。此属性在 Object.prototype.toString() 中使用。

实例方法

还从其父类 Iterator 继承实例方法.

Generator.prototype.next()

返回由 yield 表达式生成的的值。

Generator.prototype.return()

作用如同在生成器主体中当前挂起的位置插入了一个 return 语句,它会完成生成器,并允许生成器在与 try...finally 块结合使用时执行任何清理任务。

Generator.prototype.throw()

作用如同在生成器主体中当前挂起的位置插入了一个 throw 语句,它会通知生成器发生错误情况,并允许它处理错误,或执行清理并关闭自身。

示例

无限迭代器

使用生成器函数,值直到需要时才被计算。因此,生成器允许我们定义潜在的无限数据结构。

js
function* infinite() {
  let index = 0;

  while (true) {
    yield index++;
  }
}

const generator = infinite(); // "Generator { }"

console.log(generator.next().value); // 0
console.log(generator.next().value); // 1
console.log(generator.next().value); // 2
// …

规范

规范
ECMAScript 语言规范
# sec-generator-objects

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参见