生成器
试用
构造函数
没有与 Generator
构造函数相对应的 JavaScript 实体。Generator
的实例必须从 生成器函数 返回。
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
语句,它会通知生成器发生错误情况,并允许它处理错误,或执行清理并关闭自身。
示例
无限迭代器
使用生成器函数,值直到需要时才被计算。因此,生成器允许我们定义潜在的无限数据结构。
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 表格仅在浏览器中加载