<p>yield 用于委托可迭代对象,将控制权交予被委托对象并透传其每个yield值;支持数组、字符串、生成器等任意可迭代对象,并转发return/throw操作;与yield直接产出迭代器不同,yield展开产出全部值。</p>

在 JavaScript 中,yield* 是专门用来委托(delegate)另一个可迭代对象(包括其他生成器)的语法。它让当前生成器暂停执行,逐个产出被委托生成器的值,直到其结束,再继续后续逻辑。
yield* 的核心作用
yield* 不是简单地调用另一个生成器,而是“把控制权交给它”,相当于把被委托生成器的每次 yield 都“透传”出来。它自动遍历整个可迭代对象(如数组、字符串、Generator 函数返回的迭代器),无需手动循环。
基本用法:嵌套另一个生成器
定义两个生成器,用 yield* 在主生成器中嵌入子生成器:
function* numbers() {
yield 1;
yield 2;
}
<p>function<em> main() {
yield 'start';
yield</em> numbers(); // 委托执行 numbers()
yield 'end';
}</p><p>for (const val of main()) {
console.log(val); // 输出:start → 1 → 2 → end
}支持任意可迭代对象
yield* 后面可以接任何实现了 [Symbol.iterator] 的对象:
立即学习“Java免费学习笔记(深入)”;
-
数组:
yield* [3, 4]; -
字符串:
yield* 'ab';→ 产出'a'、'b' -
其他生成器:
yield* anotherGenerator(); -
自定义迭代器(只要返回带
next()方法的对象)
注意委托过程中的 return 和 throw 传递
yield* 会将外部对当前生成器的 return(value) 或 throw(err) 操作,转发给被委托的生成器(如果它支持)。例如:
function* child() {
try {
yield 'a';
yield 'b';
} catch (e) {
console.log('caught:', e.message);
}
}
<p>function<em> parent() {
yield</em> child();
yield 'done';
}</p><p>const it = parent();
console.log(it.next().value); // 'a'
it.throw(new Error('boom')); // 触发 child 内部的 catch,输出 caught: boom
console.log(it.next().value); // 'done'与普通 yield 的关键区别
直接 yield numbers() 返回的是一个迭代器对象;而 yield* numbers() 展开并产出它的每个值。前者是“产出一个生成器实例”,后者是“产出它的全部结果”。


















