JS生成器的特殊用法:委托yield*

yield 的基本用法

yield 用于在生成器函数中暂停函数执行,并返回一个值给外部调用者。当生成器再次被调用时,会从暂停的地方继续执行。

示例:

function* simpleGenerator() {
  yield 1;
  yield 2;
  yield 3;
}

const gen = simpleGenerator();

console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: undefined, done: true }

在这个例子中,yield 暂停生成器的执行并返回值,直到 gen.next() 再次被调用,才会继续从上次暂停的位置执行。

yield* 的用法

yield* 用于委托给另一个生成器或可迭代对象(例如数组、字符串、其他生成器等)。这意味着 yield* 会自动遍历这个可迭代对象,并逐个 yield 其值。

示例:委托给另一个生成器

function* generatorA() {
  yield 1;
  yield 2;
}

function* generatorB() {
  yield* generatorA();
  yield 3;
}

const genB = generatorB();

console.log(genB.next()); // { value: 1, done: false }
console.log(genB.next()); // { value: 2, done: false }
console.log(genB.next()); // { value: 3, done: false }
console.log(genB.next()); // { value: undefined, done: true }

在这个例子中,yield* generatorA() 会遍历 generatorA 的所有值,相当于:

function* generatorB() {
  yield 1;
  yield 2;
  yield 3;
}

yield* 委托给其他可迭代对象

除了生成器,yield* 还可以委托给其他任何可迭代对象,比如数组、字符串等。

示例:委托给数组

function* arrayGenerator() {
  yield* [4, 5, 6];
}

const genArray = arrayGenerator();

console.log(genArray.next()); // { value: 4, done: false }
console.log(genArray.next()); // { value: 5, done: false }
console.log(genArray.next()); // { value: 6, done: false }
console.log(genArray.next()); // { value: undefined, done: true }

yield 和 yield* 的区别

yield:用于暂停生成器的执行,并返回一个值。每次调用 next() 时,生成器会从上次暂停的地方继续。
yield*:用于将迭代过程委托给另一个生成器或可迭代对象,相当于在当前生成器中嵌入了另一个迭代过程。

猜你喜欢

转载自blog.csdn.net/qq_55018264/article/details/142963160