Generator (生成器) 普通函数在函数结束之前不会执行其他,Generator 可以在执行的过程中暂停之后再执行,
简单地说,迭代器就是实现了next()方法的一类特殊的对象。这个next()方法的返回值是一个对象,包含了value和done两个属性。
Generator 的特点是有一个 * 号
function* foo(){
for(let i = 0; i < 3; i++){
yield i
}
}
console.log(foo())
let f = foo()
console.log(f.next()) // 返回的是一个对象 {value:0, done: false}
console.log(f.next()) // 返回的是一个对象 {value:1, done: false}
console.log(f.next()) // 返回的是一个对象 {value:3, done: false}
console.log(f.next()) // 返回的是一个对象 {value:undefined, done: true}
-
next()方法的返回值中:value的值是从对象中取出的值,done代表迭代是否结束,如果为true说明迭代器中没有更多的值可以取了。
-
yield 只能在生成器里面使用
// 错误案例
function* gen(args){
args.forEach(item => {
yield item + 1
})
}
实例:
function* gen(x) {
let y = 2 * (yield(x+1))
let z = yield(y /3)
return x + y + z
}
// let g = gen(5)
// console.log(g.next()) // 6
// console.log(g.next()) // NaN
// console.log(g.next()) // NaN
let g = gen(5)
console.log(g.next()) // 6
console.log(g.next(12)) // y = 24 / 3 得出结果 8
console.log(g.next(13)) // z = 13 x = 5 y = 24 得出的结果是 42
- next() 后面是可以传递参数的,返回的结果根据 Generator 上一层的返回值
function* cont(x = 1){
while (true) {
if(x % 7 === 0){
yield x
}
x++
}
}
let n = count()
console.log(n.next().value) // 7
console.log(n.next().value) // 14
console.log(n.next().value) // 21