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
相关产品推荐
相关产品推荐

