JavaScript生成器if条件中yield表达式的求值规则疑问
生成器中 yield 表达式作为 if 条件的求值逻辑解析
错误选项排除
- 选项A错误:参与if布尔判断的是
yield表达式的返回值,而非yield操作本身的执行状态。不传参时yield返回默认值undefined,不会被判定为真。 - 选项B错误:
done是next()方法向外返回的对象属性,属于外部调用方拿到的结果,和生成器内部yield表达式的求值逻辑完全独立,不会参与if判断。 - 选项C错误:
next()返回的对象本身是外部接收到的值,生成器内部yield的返回值由上一次next()传入的参数决定,和这个返回对象的布尔值没有任何关系。
正确逻辑说明(D选项)
核心要掌握yield的求值规则:
- 首次调用生成器的
next()时,生成器会执行到第一个yield位置直接暂停。此时yield后跟随的表达式(示例中的index++)会被求值,作为本次next()返回对象的value属性;但本次调用next传入的参数会被完全丢弃,不会作为当前已执行的yield表达式的返回值。 - 从第二次调用
next(value)开始,传入的value会作为上一次暂停时的yield表达式的整体返回值,参与生成器内部的后续逻辑判断。如果调用next()时不传参数,yield表达式的返回值就是JS默认的undefined,而undefined本身就是布尔判定中的假值,自然不会触发if块执行。
示例执行流对应验证
结合代码逐次匹配输出:
- 第一次调用
foo.next():进入循环后执行到yield index++,后置自增取当前index值0作为返回value,同时index变为1,生成器暂停,返回{value: 0, done: false}。此时yield表达式尚未拿到返回值,未走到if判断环节。 - 第二次调用
foo.next(12):将上次暂停的yield表达式返回值设为12,回到if判断时12为真值,执行if块将index重置为0;回到循环后再次走到yield index++,取当前index值0作为返回value,index变为1,暂停返回{value: 0, done: false}。 - 第三次调用
foo.next():不传参时上次暂停的yield表达式返回值为undefined,为假值不触发if块;回到循环后走到yield index++,取当前index值1作为返回value,index变为2,暂停返回{value: 1, done: false}。 - 第四次调用
foo.next():不传参时上次yield返回值为undefined,不触发if块;走到yield index++,取当前index值2作为返回value,index变为3,暂停返回{value: 2, done: false}。 - 第五次调用
foo.next():不传参时上次yield返回值为undefined,不触发if块;回到while判断时index为3,不满足循环条件,生成器执行完毕,返回{value: undefined, done: true}。
内容的提问来源于stack exchange,提问作者tediousWerk
相关产品推荐
相关产品推荐

