yield* 实现对可迭代对象的委托迭代,自动遍历并透传其每个值,支持生成器、数组、字符串、set、map等,且能转发 return() 和 throw() 操作。

JavaScript 中生成器通过 yield*(yield star)语法实现对另一个可迭代对象的委托,也就是“代理 yield”操作。它不是简单地返回值,而是将控制权和迭代过程交由被委托的可迭代对象处理,逐个产出其内部的每个值。
yield* 的核心作用
yield* 会自动遍历右侧的可迭代对象(如另一个生成器、数组、字符串、Set、Map 等),并把它的每一次 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</p>支持任意可迭代对象
yield* 不限于委托其他生成器,只要右侧是实现了 [Symbol.iterator] 的对象即可:
-
数组:
yield* [3, 4]; -
字符串:
yield* "ab";→ 产出"a"、"b" -
Set/Map:
yield* new Set([5, 6]); -
自定义可迭代对象:只要返回一个符合迭代器协议的对象(含
next()方法)即可
委托中的 return 和 throw 也会被转发
当外部对委托生成器调用 return() 或 throw() 时,yield* 会尝试将这些操作传递给被委托的迭代器(如果它支持):
- 若被委托对象是生成器且有
return()方法,它会被调用,并返回其return值 - 若被委托对象不支持对应方法(如普通数组),
yield*会立即终止当前委托,并继续执行后续语句
这使得错误处理和提前退出逻辑可以自然地跨生成器边界传播。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











