生成器。
本身是函数,执行后返回迭代的对象, 内部配合yield
使用,Generator
函数分段执行, 遇到 yield
就暂停。
function * test(){
yield 'a';
yield 'b';
yield 'c';
return 'd'
// generator 函数
}
var a = text()
a.next() // {value: "a", done: false}
a.next() // {value: "b", done: false}
a.next() // {value: "c", done: false}
a.next() // {value: "d", done: true}
a.next() // {value: undefined, done: true}
再看看这个
function * test (){
let val1 = yield 'a';
console.log(val1)
let val2 = yield 'b';
console.log(val2)
let val3 = yield 'c';
console.log(val3)
return 'd';
}
还记得编程语言是怎么执行复制操作的吗?
let val1 = yield 'a';
会先执行右边的语句。然后 generator
函数碰到 yield
就会暂停, 等待下一次执行next
函数。
所以第一次执行不会打印出 val1
的值, 第二次调用 next
的时候才会打印出东西, 而且打印出来的也不是 yield 'a'
后面的'a'
, 而是取决于调用 next
函数的时候, 往里面传递的什么。
实现 generator
let obj = {
0: 'a',
1: 'b',
2: 'c',
length: 3,
[Symbol.iterator]: function *(){
let curIndex = 0;
while(curIndex !== this.length){
yield this[curIndex ++]
}
}
}
[...obj] // ["a", "b", "c"]
网友评论