yield*

该新特性属于 ECMAScript 2015(ES6)规范,在使用时请注意浏览器兼容性。

概述

在生成器中,yield* 可以把需要 yield 的值委托给另外一个生成器或者其他任意的可迭代对象。

语法

 yield* [[expression]];
expression
任意的可迭代对象

描述

yield* 一个可迭代对象,就相当于把这个可迭代对象的所有迭代值分次 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"

规范

规范名称 规范状态 备注
ECMAScript 2015 (6th Edition, ECMA-262)
Yield
Standard  

浏览器兼容性

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support (Yes) 27.0 (27.0) ? ? ?
Feature Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) 27.0 (27.0) ? ? ?

Firefox 备注

  • 从 Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30) 开始,在 yield* 之间不允许有换行符,否则会抛出 SyntaxError 异常(bug 981599):
    function* foo() {
      yield
      *[];
    } // SyntaxError!

相关链接

文档标签和贡献者

 此页面的贡献者: ccn1010, ziyunfei, Liyunsheng
 最后编辑者: ccn1010,