yield 用于委托执行,将控制权暂时移交可迭代对象(如生成器),逐个产出其值;yield gen() 仅产出生成器对象本身,而 yield gen() 才摊平并产出内部每个yield的值。

yield* 的作用是委托执行
yield* 不是简单地“调用另一个生成器”,而是把当前生成器的控制权暂时交给被委托的生成器。它让外层生成器暂停,内层生成器逐个产出值,直到完成;完成后,外层继续执行后续代码。
基本写法和执行逻辑
必须在生成器函数内部使用 yield*,后面跟一个可迭代对象(通常是另一个生成器函数的调用结果):
- yield* 后面不能直接写函数名,要写函数调用表达式,比如 yield* otherGen()
- 被委托的生成器每产出一个值,就等价于外层 yield 了一次该值
- 内层生成器 return 的值会被忽略(除非手动捕获),但它的遍历会自然结束
嵌套示例:两级生成器串联
下面是一个清晰的嵌套结构:
function* numbers() {
yield 1;
yield 2;
}
<p>function* letters() {
yield 'a';
yield 'b';
}</p><p>function<em> combined() {
yield</em> numbers(); // 展开 numbers 的所有产出
yield '—';
yield* letters(); // 展开 letters 的所有产出
}</p><p>for (let item of combined()) {
console.log(item);
}
// 输出:1, 2, '—', 'a', 'b'
</p>
注意 yield* 和普通 yield 的区别
如果误写成 yield numbers(),实际产出的是一个 Generator 对象,不是里面的数值;而 yield* numbers() 才真正“摊平”了整个序列。
- yield gen() → 产出一个 Generator 实例(类似 { [Generator] })
- yield* gen() → 产出 gen() 内部每个 yield 的值
- yield* 也支持数组、字符串、Map 等可迭代对象,不只是生成器











