You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两段仅for循环不同的JS代码,一段触发致命错误求原因

为什么第一段JavaScript代码会触发致命错误?

第一段代码(触发FATAL ERROR)

const computeDash=(num)=>{
    const arr=num.split('');
    const nums=arr.map(Number);
    for(let i=0;i<(nums.length-1);i++){
        if(nums[i]%2===0 && nums[i+1]%2===0){
            nums.splice(i,0,'-');
        }
    }
    return nums.join('');
}
console.log(computeDash('025468'));

第二段代码(正常运行)

const computeDash=(num)=>{
    const arr=num.split('');
    const nums=arr.map(Number);
    for(let i=0;i<nums.length;i++){
        if(nums[i-1]%2===0 && nums[i]%2===0){
            nums.splice(i,0,'-');
        }
    }
    return nums.join('');
}
console.log(computeDash('025468'));      //0-254-6-8

问题出在第一段代码的循环逻辑会引发无限循环,最终耗尽内存触发FATAL ERROR:

  • 这段代码用i < nums.length-1作为循环终止条件,但每次调用splice(i, 0, '-')插入元素时,数组nums的长度会动态增加,nums.length-1的值也跟着变大。
  • 比如遇到连续偶数插入'-'后,数组长度加1,而i只加1,这就导致循环可能一直无法终止——尤其是输入包含大量连续偶数时,数组会不断膨胀,直到把内存撑爆。
  • 举个例子,要是输入全是连续偶数(比如'000000'),第一段代码会在每两个偶数间插入'-',虽然插入的'-'转成数字是NaN,不会触发新的插入,但原偶数的位置会不断被后续循环处理,导致数组长度持续增长,最终触发致命错误。

而第二段代码的逻辑避开了这个坑:

  • 它用i < nums.length作为循环条件,并且判断的是前一个元素nums[i-1]和当前元素nums[i]是否都是偶数。插入'-'后,i会自然递增跳过新插入的元素,不会重复处理同一位置;就算数组长度增长,当i遍历到数组末尾时,循环也会正常终止。

内容的提问来源于stack exchange,提问作者Prem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:55:24