两段仅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
相关产品推荐
相关产品推荐

