遍历数组时直接修改长度易导致跳过元素或逻辑异常,正向for循环中splice删除会漏删甚至死循环;推荐用filter创建新数组,或反向遍历、while控制索引实现安全原地修改。

在 JavaScript 中遍历数组时直接修改其长度(比如用 splice、pop、push 或 length = 0),容易跳过元素或陷入逻辑异常,但“死循环”本身不是 JS 引擎层面的死锁,而是因索引错位导致本该结束的循环反复执行某些位置——常见于 for 正向遍历中边删边走。
反例:正向 for 循环中 splice 删除元素
下面代码看似想删掉所有偶数,实则会漏删、甚至无限执行(若循环条件依赖 arr.length 且未同步调整 i):
const arr = [2, 4, 6, 1, 3, 5]; for (let i = 0; i <p>结果可能是 <code>[4, 1, 3, 5]</code>,<code>4</code> 没被删掉,因为删了 <code>2</code> 后 <code>4</code> 移到索引 <code>0</code>,而 <code>i</code> 已变成 <code>1</code>。</p><h3>推荐方案一:倒序 for 循环</h3><p>从末尾开始遍历,删除元素不影响前面未处理项的索引:</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review"><img src="https://img.php.cn/upload/skill/000/000/081/179084711841712.jpg" alt="Java Maven Code Review" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="overflowclass">Java Maven Code Review</a> <p class="overflowclass">审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。</p> </div> <a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>
- 索引递减,每次删的是当前
i处元素,前面的索引不变 - 无需额外维护计数器,逻辑清晰安全
const arr = [2, 4, 6, 1, 3, 5];
for (let i = arr.length - 1; i >= 0; i--) {
if (arr[i] % 2 === 0) {
arr.splice(i, 1);
}
}
// 结果:[1, 3, 5]
推荐方案二:用 filter 创建新数组
不修改原数组,语义明确、无副作用,适合大多数过滤场景:
- 函数式风格,可读性高,避免意外修改
- 原数组不变,适合需要保留原始数据的场合
- 性能在大数据量下可能略低于原地操作,但通常可接受
const arr = [2, 4, 6, 1, 3, 5]; const newArr = arr.filter(x => x % 2 !== 0); // arr 不变,newArr 是 [1, 3, 5]
特殊情况:必须原地修改且需动态判断(如满足条件就停)
例如“删到第一个奇数为止”,可用 while + shift 或手动控制索引:
- 用
while (arr.length)配合shift()/pop(),每次只动一头 - 或用
for但把i的增减交给条件控制(删时不自增)
const arr = [2, 4, 6, 1, 3, 5]; let i = 0; while (i <p>核心原则是:**遍历和修改不能共享同一套索引节奏**。倒序、过滤、显式控制步进,三者选其一即可避开陷阱。</p>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










