You need to enable JavaScript to run this app. JavaScript生成器if条件中yield表达式的求值规则疑问
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript生成器if条件中yield表达式的求值规则疑问

生成器中 yield 表达式作为 if 条件的求值逻辑解析

错误选项排除

  • 选项A错误:参与if布尔判断的是yield表达式的返回值,而非yield操作本身的执行状态。不传参时yield返回默认值undefined,不会被判定为真。
  • 选项B错误:done是next()方法向外返回的对象属性,属于外部调用方拿到的结果,和生成器内部yield表达式的求值逻辑完全独立,不会参与if判断。
  • 选项C错误:next()返回的对象本身是外部接收到的值,生成器内部yield的返回值由上一次next()传入的参数决定,和这个返回对象的布尔值没有任何关系。

正确逻辑说明(D选项)

核心要掌握yield的求值规则:

  1. 首次调用生成器的next()时,生成器会执行到第一个yield位置直接暂停。此时yield后跟随的表达式(示例中的index++)会被求值,作为本次next()返回对象的value属性;但本次调用next传入的参数会被完全丢弃,不会作为当前已执行的yield表达式的返回值。
  2. 从第二次调用next(value)开始,传入的value会作为上一次暂停时的yield表达式的整体返回值,参与生成器内部的后续逻辑判断。如果调用next()时不传参数,yield表达式的返回值就是JS默认的undefined,而undefined本身就是布尔判定中的假值,自然不会触发if块执行。

示例执行流对应验证

结合代码逐次匹配输出:

  1. 第一次调用foo.next():进入循环后执行到yield index++,后置自增取当前index值0作为返回value,同时index变为1,生成器暂停,返回{value: 0, done: false}。此时yield表达式尚未拿到返回值,未走到if判断环节。
  2. 第二次调用foo.next(12):将上次暂停的yield表达式返回值设为12,回到if判断时12为真值,执行if块将index重置为0;回到循环后再次走到yield index++,取当前index值0作为返回value,index变为1,暂停返回{value: 0, done: false}。
  3. 第三次调用foo.next():不传参时上次暂停的yield表达式返回值为undefined,为假值不触发if块;回到循环后走到yield index++,取当前index值1作为返回value,index变为2,暂停返回{value: 1, done: false}。
  4. 第四次调用foo.next():不传参时上次yield返回值为undefined,不触发if块;走到yield index++,取当前index值2作为返回value,index变为3,暂停返回{value: 2, done: false}。
  5. 第五次调用foo.next():不传参时上次yield返回值为undefined,不触发if块;回到while判断时index为3,不满足循环条件,生成器执行完毕,返回{value: undefined, done: true}。

内容的提问来源于stack exchange,提问作者tediousWerk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 05:15:04