<p>yield* 是 Generator 函数中委托迭代的语法,可逐个产出另一生成器或原生可迭代对象(数组、字符串、Set、Map)的值,并支持返回值传递与异常透传。</p>

yield* 是 Generator 函数中用于委托迭代的语法,它会逐个 yield 另一个生成器或可迭代对象(如数组、字符串、Set、Map 等)的每个值,相当于把控制权“交出去”,等对方迭代完再回来继续执行。
yield* 委托生成器函数
被委托的必须是可迭代对象,而生成器函数调用后返回的就是一个可迭代对象(即生成器实例),所以可以直接用 yield* 调用:
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'
}yield* 委托普通可迭代对象
数组、字符串、Set、Map 等原生可迭代对象也能被 yield* 消费,内部会自动调用其 [Symbol.iterator]() 方法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
yield* [1, 2, 3]→ 依次产出1、2、3 -
yield* "hi"→ 产出'h'、'i'(字符串按字符迭代) -
yield* new Set(['x', 'y'])→ 产出'x'、'y'(顺序依插入顺序) -
yield* new Map([[1, 'a'], [2, 'b']])→ 产出[1, 'a']、[2, 'b'](Map 默认迭代键值对)
yield* 的返回值与异常传递
yield* 表达式本身有返回值:当被委托的可迭代对象遍历结束时,若它返回了值(比如生成器通过 return(value) 结束),该值就是 yield* 的返回值;同时,throw() 或 return() 也会穿透到被委托的生成器中:
立即学习“Java免费学习笔记(深入)”;
function* inner() {
yield 'x';
return 'done'; // 这个值会成为 yield* 的返回值
}
<p>function<em> outer() {
const result = yield</em> inner();
console.log(result); // 'done'
yield 'y';
}注意点
-
yield*后面不能跟普通对象(除非手动实现[Symbol.iterator]) - 不能写成
yield* someGenerator(没加括号)——必须是调用表达式,如yield* someGenerator() - 委托过程中,
next()、throw()、return()都会透传,适合做流程组合与错误处理

















