前面了解了 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 等)。