yield*
表达式用于委托给另一个generator
或可迭代对象。
语法
yield* [[expression]];
-
expression
- 返回一个可迭代对象的表达式。
描述
yield*
表达式迭代操作数,并产生它返回的每个值。
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 |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) Yield |
Standard | Initial definition. |
ECMAScript Latest Draft (ECMA-262) Yield |
Draft |
浏览器兼容
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out
https://github.com/mdn/browser-compat-data and send us a pull request.
Update compatibility data on GitHub
Desktop | Mobile | Server | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
yield* |
Chrome Full support 39 | Edge Full support 12 | Firefox Full support 27
|
IE No support No | Opera Full support 26 | Safari Full support 10 | WebView Android Full support 39 | Chrome Android Full support 39 | Firefox Android Full support 27
|
Opera Android Full support 26 | Safari iOS Full support 10 | Samsung Internet Android Full support 4.0 | nodejs Full support 4.0.0
|
Legend
- Full support
- Full support
- No support
- No support
- See implementation notes.
- See implementation notes.
- User must explicitly enable this feature.
- User must explicitly enable this feature.
Firefox 特别提示
- 从 Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30) 开始,
yield
表达式的解析已被更新以符合ES2015规范(bug 981599):- 现在有行结束符限制。在
yield
和*
之间不允许有换行符。如下代码会抛出SyntaxError
:function* foo() { yield *[]; }
- 现在有行结束符限制。在