关于两次输出NaN,对应的 yield 语句

来源:4-11 异步编程解决方案Generator(上)

永远幸运

2022-01-29

老师您好:
关于这段代码,我不太懂,第二次输出的 NaN 到底是在第一个 yield(x + 1) 就终止了,还是第二个 yield(y / 3) 终止的。

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 这里没懂,第二次输出的 NaN 到底是在第一个 yield 就终止了,还是第二个。
console.log(g.next()) // NaN
写回答

1回答

谢成

2022-02-03

首先需要了解next方法的使用方式:调用next方法时,会从当前 yield 之后的语句继续执行,直到下一个 yield 位置暂停。next() 返回一个包含 value 和 done 属性的对象。value 属性表示本次 yield 表达式返回值,done 表示后续是否还有 yield 语句。


g.next() // Object{value:6, done:false}

// 运行next方法的时候不带参数,导致 y 的值等于2 * undefined(即NaN)

g.next() // Object{value:NaN, done:false}

// 除以 3 以后还是NaN,因此返回对象的value属性也等于NaN

g.next() // Object{value:NaN, done:true}



0
0

JavaScript ES(6-11)全版本语法 前端都需要的基础课

前端无门槛学习,从ES6到ES11,一套课程掌握JS最新语法

1328 学习 · 296 问题

查看课程