16.6.0 yield*表达式

1:如果在generator内部调用另外一个generator;默认情况是没有效果的。也不会报错

function* foo() {
    yield 'a'
    yield 'b'
}
function* bar () {
    yield 'x'
    foo()
    yield 'y'
}
for(let v of bar()){
    console.log(v)
}
// 输出结果
// x
// y

这个时候就必须用到yield*

function* foo() {
    yield 'a'
    yield 'b'
}
function* bar () {
    yield 'x'
    yield* foo()
    yield 'y'
}
for(let v of bar()){
    console.log(v)
}
var g=bar()
console.log(g.next())
console.log(g.next())
console.log(g.next())
console.log(g.next())
console.log(g.next())
// 输出结果
// x
// a
// b
// y
// { value: 'x', done: false }
// { value: 'a', done: false }
// { value: 'b', done: false }
// { value: 'y', done: false }
// { value: undefined, done: true }

2:从语法角度看,如果yield命令后跟一个遍历器对象,那么需要在yield后面加上星号。表明返回的是一个遍历器对象;
3:yield*后面的generator函数(在没有return语句时)=在函数内部部署一个for…of循环;yield*不过是for…of的一种简写形式;

```
function* foo() {
    yield 'a'
    yield 'b'
}
function* bar () {
    yield 'x'
    //yield* foo()
    for(let v of foo()){
        yield v
    }
    yield 'y'
}
for(let v of bar()){
    console.log(v)
}

4:因为数组支持遍历器,因此

function* gen() {
    yield* [1,2,3]
}
var g=gen()
console.log(g.next())  //{ value: 1, done: false }
console.log(g.next())  //{ value: 2, done: false }
console.log(g.next())  //{ value: 3, done: false }
console.log(g.next())  //{ value: undefined, done: true }

5:任何数据结构只要有inerator接口,就可以被yield*遍历
6:如果有return语句,就可以向代理它的generator函数返回数据

function *foo() {
    yield 2
    yield 3
    return 'foo'
}
function *bar() {
    yield 1
    var v=yield *foo()
    console.log('v='+v)
    yield 4
}
var g=bar()
console.log(g.next())
console.log(g.next())
console.log(g.next())
console.log(g.next())
console.log(g.next())
// 执行结果
// { value: 1, done: false }
// { value: 2, done: false }
// { value: 3, done: false }
// v=foo
// { value: 4, done: false }
// { value: undefined, done: true }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值