前面了解了 yield 的作用,即暂停函数的执行并返回右值。那 yield* 是什么呢?我们举例说明:

Array与String

function* GenFunc() {
  yield [1, 2];
  yield* [3, 4];
  yield "56";
  yield* "78";
}
var gen = GenFunc();
console.log(gen.next().value); // [1, 2]
console.log(gen.next().value); // 3
console.log(gen.next().value); // 4
console.log(gen.next().value); // 56
console.log(gen.next().value); // 7
console.log(gen.next().value); // 8

arguments

function* GenFunc() {
  yield arguments;
  yield* arguments;
}
var gen = GenFunc(1, 2);
console.log(gen.next().value); // { '0': 1, '1': 2 }
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2

Generator

function* Gen1() {
  yield 2;
  yield 3;
}
function* Gen2() {
  yield 1;
  yield* Gen1();
  yield 4;
}
var g2 = Gen2();
console.log(g2.next().value); // 1
console.log(g2.next().value); // 2
console.log(g2.next().value); // 3
console.log(g2.next().value); // 4

Object

function* GenFunc() {
  yield {a: '1', b: '2'};
  yield* {a: '1', b: '2'};
}
var gen = GenFunc();
console.log(gen.next()); // { value: { a: '1', b: '2' }, done: false }
console.log(gen.next()); // TypeError: undefined is not a function

从上面几个例子可以看出,yield 与 yield* 的区别在于:yield 只是返回右值,而 yield* 则将函数委托(delegate)到另一个生成器( Generator)或可迭代的对象(如字符串、数组和类数组 arguments,以及 ES6 中的 Map、Set 等)。