js中的yield*
时间: 2024-01-17 08:10:51 浏览: 105
在JavaScript中,yield*是一个关键字和表达式。yield*关键字用于将控制权委托给另一个生成器或可迭代对象。当使用yield*时,它会迭代并返回委托生成器或可迭代对象中的每个值,直到迭代完毕。
例如,在下面的代码示例中,函数g2委托给了函数g1,通过yield* g1(),函数g2会先返回自身的第一个值1,然后继续执行委托的函数g1,并返回g1的每个值,最后再返回g2的剩余值4。
```javascript
function* g1() {
yield 2;
yield 3;
}
function* g2() {
yield 1;
yield* g1();
yield 4;
}
var iter = g2();
console.log(iter.next()); // { value: 1, done: false }
console.log(iter.next()); // { value: 2, done: false }
console.log(iter.next()); // { value: 3, done: false }
console.log(iter.next()); // { value: 4, done: false }
console.log(iter.next()); // { value: undefined, done: true }
```
另外,你还可以使用yield*表达式将控制权委托给其他生成器,并在委托生成器中使用yield语句来产生值。在下面的代码示例中,函数outer内部使用yield* next将控制权委托给函数inner,并可以通过yield语句在inner中产生值。结果是,在调用gen.next()两次后,会依次返回'open'、'hello'、'world'和'close'。
```javascript
function* outer(next) {
yield 'open';
yield* next;
yield 'close';
}
function* inner() {
yield 'hello';
a = 2;
yield 'world';
}
gen = outer(inner());
console.log(gen.next()); // { value: 'open', done: false }
console.log(gen.next()); // { value: 'hello', done: false }
console.log(gen.next()); // { value: 'world', done: false }
console.log(gen.next()); // { value: 'close', done: false }
```
总结来说,yield*在JavaScript中用于将控制权委托给其他生成器或可迭代对象,并可以通过yield语句在委托生成器中产生值。
阅读全文