Generator

Baseline 已广泛支持

此特性已非常成熟,可在多种设备和浏览器版本上使用。自 ⁨2016 年 9 月⁩以来,它已在各大浏览器中可用。

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

Generator 是隐藏的 Iterator 类的子类。

构造函数

没有 JavaScript 实体与 Generator 构造函数对应。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® 2026 语言规范
# sec-generator-objects

浏览器兼容性

另见