You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript迭代器中何时设done为true?解析差一错误

理解JavaScript迭代器的"差一"逻辑

咱们一步步拆解这个迭代器的执行过程,就能明白为什么它能正常运行:

  • 初始状态:idx = 0,数组numbers的长度是3(有效索引为0、1、2,对应值1、2、3)
  • 第一次调用next():
    • 先取numbers[idx++],也就是numbers[0](值为1),随后idx自增为1
    • 判断idx > numbers.length → 1 > 3?结果为false,返回{value:1, done:false},for...of会读取这个value并打印1
  • 第二次调用next():
    • 取numbers[1](值为2),idx自增为2
    • 判断2 > 3?结果为false,返回{value:2, done:false},打印2
  • 第三次调用next():
    • 取numbers[2](值为3),idx自增为3
    • 判断3 > 3?结果为false,返回{value:3, done:false},打印3
  • 第四次调用next():
    • 取numbers[3](数组没有这个索引,值为undefined),idx自增为4
    • 判断4 > 3?结果为true,返回{value:undefined, done:true}

核心逻辑在于:for...of循环会在next()返回的done为true时立刻终止,不会处理这次返回的value。所以第四次返回的undefined根本不会被打印,循环在遍历完所有有效元素后就正常结束了。

另外要明确迭代器的规范:当done为true时,value可以是任意值(甚至可以省略),循环类结构会直接忽略这个值。这个实现通过「先取值再自增索引」的逻辑,让三次有效遍历对应done:false的返回,第四次返回终止信号,完全符合迭代器的工作规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:10:20