数组遍历中用 while + 手动更新索引可实现动态跳转、条件跳过或回退,比 for...of 更灵活;reduce 依赖前项时需加索引安全判断,如 i > 0。

数组遍历中直接用索引控制流程,能灵活实现条件跳转、多步处理或模拟状态机逻辑,比单纯 for...of 或 forEach 更有表现力。
用 while + 手动更新索引实现动态跳转
for 循环的步进是固定的,而 while 可以根据当前元素内容决定下一步索引——比如跳过若干项、回退处理、或按规则跳跃。
- 初始化 let i = 0,在循环体内根据条件修改 i(如
i += 2、i--或i = nextIndex) - 每次迭代前检查 i ,避免越界
- 适合场景:解析带指令的字节流、跳过注释块、匹配成对标记(如括号匹配时跳到对应闭合位置)
结合 map 或 reduce 保留索引参与计算
map 和 reduce 的回调函数默认提供第二个参数 index,可直接用于分支判断或位置敏感运算。
-
arr.map((item, i) => i % 2 === 0 ? item * 2 : item)—— 偶数位翻倍 -
arr.reduce((acc, item, i) => i > 0 && item > arr[i-1] ? [...acc, item] : acc, [])—— 提取上升沿元素 - 注意:reduce 中若依赖前一项,需确保索引安全(如 i > 0),避免访问 undefined
用 for (let i = 0; i
这种写法把索引更新交给循环体内部,让跳转逻辑更显性、更易调试。
- 省略 for 的第三部分(即不自动 i++),由 if/else 决定如何推进
-
if (arr[i] === 'SKIP') { i += 3; continue; }—— 遇到标记跳三格 -
if (arr[i] === 'STOP') break;—— 满足终止条件立即退出 - 比 while 更贴近传统 for 的结构,又保有控制权
避免常见陷阱
索引跳转虽灵活,但容易引发边界错误或无限循环。
- 每次修改索引后,确认不会跳到负数或超出 length;建议统一用
i = Math.max(0, Math.min(i, arr.length))做防护(视需求而定) - 避免在循环中意外修改原数组长度(如 push/splice),否则 length 动态变化可能打乱预期跳转
- 多人协作时,加简短注释说明跳转意图,例如
// 跳过下一个元素:格式化参数占两位











