// yield IE浏览器不兼容哦 但是IE edge兼容
// 碰到yield就停止,生成yield对象,对象的value属性是yield后面的值
function* yieldTest () {
let array = [5, 4, 3]
for (let i = 0; i < array.length; i++) {
yield array[i] // yield使生成器函数暂停执行,yield实际返回的是迭代器对象
}
}
// 在判断语句中应用next()会消耗迭代的次数,每次判断都会消耗
// 如果yield在其他表达式中,需要用()单独括起来
// 不可以直接传递yield值
// console.log('开始构造了')
// console.log(yieldTest)
//
let itemTest = yieldTest()
// console.log(itemTest)
console.log(itemTest.next()) // yield本身没有返回值(undefined),有返回值的是next(),next可以无限次调用,但是迭代完成后均返回undefined
console.log(itemTest.next()) // yield和next需要配合使用
console.log(itemTest.next()) // 返回两个参数,一个是返回值,一个是是否完成
console.log(itemTest.next()) // 返回值是undefined时候,才表示已经结束了
function* yieldTry () {
for (let i = 0; true; i++) {
var reset = yield i
if(reset) {
i = -1
}
}
}
let yieldItem = yieldTry()
// console.log(yieldItem.next())
// console.log(yieldItem.next())
// console.log(yieldItem.next())
// console.log(yieldItem.next())
// console.log(yieldItem.next())
// console.log(yieldItem.next())
// console.log(yieldItem.next(true))
// console.log(yieldItem.next(true))
// console.log(yieldItem.next(false))
// 越来越难以理解
function* yieldMath (x) {
var y = 2 * (yield (x + 1))
var z = yield(y / 3)
console.log('x=' + x + ',y=' + y + ',z=' + z)
return (x + y + z)
// console.log('final result:' + (x + y + z))
}
// var a = yieldMath(5)
// a.next()
// a.next()
// a.next()
//
// var b = yieldMath(5)
// console.log(b.next())
// console.log(b.next(12))
// console.log(b.next(13))