next()方法返回{value, done}对象,必须解构使用;迭代器惰性求值、不可重置,for...of中混用手动next会导致状态错乱,空数组首次next即done: true。

next 方法返回的对象结构必须解构清楚
调用数组迭代器的 next() 方法总会返回一个形如 { value: any, done: boolean } 的对象,不是直接返回值,也不是布尔标识。很多人误以为 next() 返回 value 或抛出异常,结果在条件判断时写成 if (it.next()) 导致逻辑错误。
-
done: true表示迭代结束,此时value可能为undefined(严格模式下)或遗留上一次值(某些旧引擎行为),不能依赖 - 必须显式检查
result.done === false才安全读取result.value - 推荐用解构赋值避免重复访问:
const { value, done } = it.next();
手动步进时容易忽略迭代器的“惰性求值”特性
数组的 Symbol.iterator 返回的是一个惰性迭代器——它不预计算后续项,每次 next() 才取下一个元素。这意味着你可以中途停顿、跳过、甚至嵌套使用多个迭代器操作同一数组,互不影响。
- 对同一个数组调用两次
[1,2,3][Symbol.iterator](),得到两个完全独立的状态机 - 但若反复复用同一个迭代器实例(比如在循环中没重置),
next()会持续推进,直到done: true后再调用仍返回{ value: undefined, done: true } - 没有内置的 “rewind” 或 “reset” 方法;需要重新获取迭代器才能重来
在 for...of 循环里混用 next 会导致状态错乱
for...of 内部自动调用 next(),如果在循环体中又手动调用同个迭代器的 next(),就会跳过下一个元素,甚至提前终止。
- 错误示范:
const it = arr[Symbol.iterator](); for (const x of arr) { console.log(x); it.next(); // 多走一步 → 下次 for...of 拿到的是再下一项 } - 正确做法:要么纯手动控制(全用
while (!it.next().done)),要么纯用for...of,不要交叉 - 若需条件跳过,应在
for...of中用continue,而非干预底层迭代器
不同环境对空数组迭代器的 next 行为一致但易被误解
空数组 [] 的迭代器首次调用 next() 就返回 { value: undefined, done: true }。这看似简单,但在组合逻辑中容易埋雷。
- 比如写
const first = it.next().value期望拿到首项,空数组时得到undefined,但无法区分是数组真有undefined元素,还是根本没元素 - 更健壮的写法是先检查
done:const { value, done } = it.next(); if (!done) use(value); - Node.js 16+ 和现代浏览器行为一致,但 IE 完全不支持迭代器,需确保运行环境
next() 是原子推进,且返回对象必须按结构消费。一旦开始手动控制,就别指望任何自动恢复或隐式重置。

















