跳到主要内容

生成器

生成器函数有哪些定义形式?​

  • 特征: 函数名前加 *;
function* generatorFn() {} // 函数声明
const generatorFn2 = function* () {}; // 函数表达式
const foo = { *generatorFn() {} }; // 对象字面量方法
class Foo {
*generatorFn() {} // 类实例方法
static *staticFn() {} // 类静态方法
}
  • 限制: 箭头函数不能定义为生成器;

生成器如何作为默认迭代器使用?​

  • 用法: 把 *[Symbol.iterator]() 定义在类或对象上, 用 yield 依次产出值;
class Person {
constructor() {
this.nicknames = ["Jack", "Jake", "J-Dog"];
}
*[Symbol.iterator]() {
yield* this.nicknames.entries();
}
}
[...new Person()]; // [[0, 'Jack'], [1, 'Jake'], [2, 'J-Dog']]
  • 迭代方式: 生成器对象本身是迭代器, 通过 next() 驱动, 协议细节见 迭代器;
  • 类中定义: 实例方法生成器定义在原型上, 静态方法生成器定义在类上;
class Person {
*createNicknameIterator() {
yield "Jack";
yield "Jake";
}
static *createJobIterator() {
yield "Butcher";
}
}
Person.createJobIterator().next().value; // "Butcher"
new Person().createNicknameIterator().next().value; // "Jack"
  • 源码边界: 上游笔记中 yield 的中断执行、生成器作为默认迭代器与提前终止仅保留标题, 未留下可核对内容, 此处不补写;