<p>yield* 是 Generator 函数中用于委托可迭代对象的关键语法,它展开并逐个产出被委托对象的所有值,支持 Generator、数组、字符串等,自动透传 done 和异常,返回被委托生成器的 return 值。</p>

yield* 是 Generator 函数中用于委托(delegation)的关键语法,它把当前生成器的执行权“交出去”,直接遍历并产出另一个可迭代对象(比如另一个 Generator 函数)的所有值,等它彻底完成后再继续执行后续代码。
yield* 委托另一个生成器的基本写法
只需在 yield 后加一个星号 *,再跟上另一个生成器的调用表达式即可。注意:后面必须是可迭代对象(如 Generator 实例、数组、字符串等),但最常见的是另一个 Generator 函数调用。
例如:
function* genA() {
yield 1;
yield 2;
}
<p>function<em> genB() {
yield 'a';
yield</em> genA(); // ← 这里委托执行 genA,依次产出 1、2
yield 'b';
}</p><p>for (let v of genB()) {
console.log(v); // 输出: 'a', 1, 2, 'b'
}</p>yield* 会自动展开嵌套生成器
它不是简单地返回一个生成器对象,而是“展开”整个迭代过程——内部逐个调用被委托生成器的 next(),把每个 value 直接 yield 出来,并透传 done 和 return 的行为。
立即学习“Java免费学习笔记(深入)”;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 被委托的生成器如果中途 return,其返回值会被忽略(除非你手动捕获)
- 如果被委托生成器抛出异常,会向上传播到当前生成器
- yield* 表达式本身有返回值:就是被委托生成器最终 return 的值(如果有)
yield* 也支持其他可迭代对象
不只是 Generator,任何实现了 [Symbol.iterator] 的对象都可以被 yield* 展开:
-
数组:
yield* [1, 2, 3]→ 等价于yield 1; yield 2; yield 3; -
字符串:
yield* "hi"→ 产出'h','i' - arguments 或 Set/Map 等也适用
这使得 yield* 成为一种简洁的“扁平化”工具,尤其适合递归生成器或组合多个数据源。
实际场景:递归遍历树结构
比如想用生成器深度优先遍历一棵树,可以用 yield* 委托子节点的遍历结果:
function* traverse(node) {
if (!node) return;
yield node.value;
for (let child of node.children || []) {
yield* traverse(child); // ← 递归委托,代码清晰且不爆栈
}
}
相比手动写循环 + 调用 next(),yield* 让逻辑更直观、更符合声明式风格。

















