Skip to content

yield 关键字

什么是 yield 关键字

yield 关键字可以让生成器函数停止执行,然后返回一个值给调用者,函数的作用域状态会被保留。停止的生成器对象可以通过调用 next() 方法恢复执行。

yieldyield*

  • yield 关键字用于返回一个值,并暂停生成器的执行状态,直到调用 next() 方法再次唤醒生成器。
  • yield* 关键字用于委托另一个生成器或可迭代对象的迭代,它会在生成器内调用另一个生成器,并将所有的值依次返回,避免手动遍历子生成器。

yield 关键字的用法

作为迭代器

ts
function* generatorFn1() {
  for (const x of [1, 2, 3]) {
    yield x;
  }
}

// generatorFn1 等价于 generatorFn2

function* generatorFn2() {
  yield* [1, 2, 3];
}

作为递归实现

ts
function* nTimes(n: number): Generator<number, void, void> {
  if (n > 0) {
    yield* nTimes(n - 1);
    yield n;
  }
}

for (const num of nTimes(5)) {
  console.log(num);
}

作为默认迭代器

ts
class Foo {
  private values: number[];
  constructor() {
    this.values = [1, 2, 3];
  }
  *[Symbol.iterator]() {
    yield* this.values;
  }
}

const foo = new Foo();
for (const num of foo) {
  console.log(num);
}