反向 for 循环最安全,从末尾遍历删除不影响未访问索引;while 循环手动控索引更灵活可靠;应避开 foreach 和正向 for 遍历时调用 splice,否则会因索引错位跳过元素。

在 JavaScript 中,遍历数组时直接修改原数组(比如边遍历边 splice 删除)很容易出错——最典型的就是跳过元素。根本原因在于:多数遍历方法(如 forEach、正向 for)按固定索引顺序执行,而删除操作会动态改变数组长度和后续元素的索引位置。
反向 for 循环(推荐用于就地删除)
从最后一个索引开始往前遍历,删除元素不会影响尚未访问的索引:
- 写法简洁,性能好,逻辑直观
- 适用于需要直接修改原数组、且不关心顺序或顺序无关紧要的场景
- 示例:for (let i = arr.length - 1; i >= 0; i--) { if (condition) arr.splice(i, 1); }
while 循环(显式控制索引)
手动管理索引,只在未删除时才递增,确保每个位置都被检查:
- 适合条件复杂、需多次判断或混合操作(如删+改)的场景
- 避免了索引错位,比正向
for更可靠 - 示例:let i = 0; while (i
filter + 赋值(推荐函数式写法)
不直接修改原数组,而是生成新数组并重新赋值:
- 无副作用,可预测性强,符合现代 JS 实践
- 代码更短、更易读、更易测试
- 注意:这是“替换”而非“修改”,若其他变量引用原数组,它们不会自动更新
- 示例:arr = arr.filter(item => !shouldDelete(item));
哪些遍历方式要特别避开?
不要在 forEach 中调用 splice 或 pop/shift —— 因为 forEach 的迭代器基于初始长度和索引快照,删除后数组收缩,但循环仍按原计划推进,必然漏掉紧邻的下一个元素。
- 同样,正向
for (let i = 0; i 配合 <code>splice(i, 1)也会跳项 -
for...of和for...in也不适合边遍历边删——前者无索引,后者遍历的是键名(可能含非数字属性),都不适配删除逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











