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 }