JavaScript中迭代器对象的next()方法每次调用返回含value和done属性的对象,value为当前值(可为undefined),done为布尔值标识是否结束;二者缺一不可,否则违反迭代器协议。

JavaScript中迭代器对象的next()方法是访问可迭代数据的核心接口,它每次调用都返回一个固定结构的对象,这个结构决定了迭代是否继续、当前值是什么、以及是否完成。
next() 方法的基本行为
next() 是迭代器协议规定的唯一必需方法。只要一个对象拥有该方法,且返回符合约定的结构,它就被视为合法迭代器。该方法不接收参数(或最多接受一个用于yield*委托的可选值),每次调用后推进内部状态,并返回结果对象。
返回对象的标准结构
每次调用 next() 必须返回一个对象,该对象必须包含以下两个属性:
-
value:表示本次迭代产出的值。可以是任意类型,包括
undefined;即使迭代结束,也应存在(如生成器中return的值会成为value) -
done:布尔值,表示迭代是否已结束。
true表示没有更多值可产出了;false表示还有后续值
注意:done 和 value 缺一不可,否则不符合迭代器协议。例如手动实现时写成 { value: 42 }(漏掉 done)会导致 for...of 等语法无法正确终止。
立即学习“Java免费学习笔记(深入)”;
常见场景下的返回差异
不同来源的迭代器,其 next() 返回细节略有差异:
-
数组/字符串等内置可迭代对象:正常遍历时
done: false,最后一项后变为done: true,且value为undefined -
Generator 函数返回的迭代器:可通过
yield输出值(done: false),也可用return终止并携带返回值(done: true且value为return表达式的值) -
手动实现的迭代器:需自行维护状态,确保
done在恰当时机变为true,避免无限循环或提前终止
与 for...of 和扩展运算符的联动关系
for...of 循环和 [...iterable] 扩展运算符底层都依赖 next() 的返回结构。它们持续调用 next(),直到收到 { done: true } 才停止。如果 done 永远为 false,就会陷入死循环;如果 value 缺失或类型异常,可能引发隐式转换错误或逻辑偏差。










