--- title: yield* slug: Web/JavaScript/Reference/Operators/yield* tags: - ECMAScript 2015 - Generators - Iterable - Iterator - JavaScript - Operator - Reference translation_of: Web/JavaScript/Reference/Operators/yield* ---
yield* 表达式用于委托给另一个{{jsxref("Statements/function*", "generator")}} 或可迭代对象。
yield* [[expression]];
expressionyield* 表达式迭代操作数,并产生它返回的每个值。
yield* 表达式本身的值是当迭代器关闭时返回的值(即done为true时)。
以下代码中,g1() yield 出去的每个值都会在 g2() 的 next() 方法中返回,就像那些 yield 语句是写在 g2() 里一样。
function* g1() {
yield 2;
yield 3;
yield 4;
}
function* g2() {
yield 1;
yield* g1();
yield 5;
}
var iterator = g2();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
除了生成器对象这一种可迭代对象,yield* 还可以 yield 其它任意的可迭代对象,比如说数组、字符串、arguments 对象等等。
function* g3() {
yield* [1, 2];
yield* "34";
yield* arguments;
}
var iterator = g3(5, 6);
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: "3", done: false }
console.log(iterator.next()); // { value: "4", done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: 6, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
yield* 表达式的值yield* 是一个表达式,不是语句,所以它会有自己的值。
function* g4() {
yield* [1, 2, 3];
return "foo";
}
var result;
function* g5() {
result = yield* g4();
}
var iterator = g5();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true },
// 此时 g4() 返回了 { value: "foo", done: true }
console.log(result); // "foo"
| Specification | Status | Comment |
|---|---|---|
| {{SpecName('ES2015', '#', 'Yield')}} | {{Spec2('ES2015')}} | Initial definition. |
| {{SpecName('ESDraft', '#', 'Yield')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.operators.yield_star")}}
yield表达式的解析已被更新以符合ES2015规范({{bug(981599)}}):
yield 和 * 之间不允许有换行符。如下代码会抛出{{jsxref("SyntaxError")}}:
function* foo() {
yield
*[];
}