// 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))