yield* 用于委托迭代,将执行权交给可迭代对象并逐个产出其值;它要求被委托对象必须可迭代,且表达式返回被委托迭代器的return值。

Generator 中的 yield*(yield 星号)用于委托迭代,把当前 Generator 的执行权交给另一个可迭代对象(如另一个 Generator、数组、字符串、Map 等),并逐个产出其值,就像“展开”了那个迭代过程。
yield* 的核心作用是迭代委托
它不是简单地返回整个对象,而是将被委托对象的每次 yield 或迭代项,逐一“透传”给当前 Generator 的调用者。相当于把两个 Generator 的执行流无缝接续起来。
- 被委托的对象必须是 可迭代的(iterable),即拥有
[Symbol.iterator]()方法 - 普通对象默认不可迭代,直接
yield* {a:1}会报错;需手动实现迭代器或转为数组等 -
yield*表达式本身有返回值:当被委托的迭代器结束时,其return(value)的值会成为yield*表达式的返回值
常见委托目标及写法示例
✅ 委托另一个 Generator:
function* genA() {
yield 'a';
yield 'b';
}
function* genB() {
yield 1;
yield* genA(); // 委托 genA,依次产出 'a', 'b'
yield 2;
}
// [...genB()] → [1, 'a', 'b', 2]
✅ 委托数组(隐式调用 Array.prototype[Symbol.iterator]):
function* gen() {
yield* [10, 20];
yield* "hi"; // 字符串也是可迭代的 → 'h', 'i'
}
// [...gen()] → [10, 20, 'h', 'i']
✅ 委托 Map(按插入顺序产出 [key, value] 数组):
function* genMap() {
const m = new Map([['x', 1], ['y', 2]]);
yield* m; // 每次产出一个 [key, value] 数组
}
// [...genMap()] → [['x', 1], ['y', 2]]
yield* 与普通 yield 的关键区别
普通 yield expr:把 expr 的求值结果作为一个整体产出一次。
yield* iterable:不产出 iterable 本身,而是遍历它,对它的每一项执行一次 yield。
-
yield [1,2]→ 产出一个数组[1,2] -
yield* [1,2]→ 产出两个值:1,然后2 - 委托过程中,如果外部通过
next()传入值,该值会作为被委托 Generator 的next()参数(仅对 Generator 类型有效)
注意 return 值的传递逻辑
当被委托的 Generator 显式 return 时,其返回值会成为 yield* 表达式的值,并可被当前 Generator 继续使用:
function* child() {
yield 'first';
return 'done';
}
function* parent() {
const result = yield* child(); // result = 'done'
yield `child finished: ${result}`;
}
// [...parent()] → ['first', 'child finished: done']
这个机制让嵌套 Generator 能自然地传递完成状态和数据,适合构建分层流程或递归生成器(如遍历树结构)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











