使用构造函数创建的数组调用push()触发致命错误(字面量数组正常)
问题原因分析
你遇到的是无限循环导致内存溢出的问题,核心冲突点在Array(10)的特性和循环条件上:
Array(10)创建的是一个**长度为10,但所有元素位置都是空槽(empty)**的数组,初始length值就是10。- 你的循环条件是
i < arr2.length,但每次调用push(5)都会让数组length加1。这就导致i从0开始每次+1,arr2.length也同步+1,i永远追不上arr2.length,循环永远停不下来,直到内存耗尽触发V8引擎的致命错误。
为什么其他方式没问题?
- 用字面量
[]创建空数组时,初始length是0,循环条件i < arr2.length一开始就不成立,循环根本不会执行,自然不会报错。要是你用字面量创建固定长度数组(比如[...Array(10)]),再用同样的循环条件+push,一样会触发无限循环。 - 改用
arr2[i] = 5赋值时,只是填充数组的空槽,不会改变数组length(始终是10),i从0到9循环10次后就正常结束。
解决方案
根据需求,有几种常用解决方式:
- 直接填充10个5:
const arr2 = Array(10).fill(5);
- 循环+push的话,固定循环次数:
const arr2 = []; for(let i = 0; i < 10 ; i++) { arr2.push(5); }
- 填充
Array(10)的空槽:
const arr2 = Array(10); for(let i = 0; i < arr2.length ; i++) { arr2[i] = 5; } // 或者用map,注意先填充空槽为undefined const arr2 = Array(10).fill().map(() => 5);
内容的提问来源于stack exchange,提问作者RETOVSKEJ
相关产品推荐
相关产品推荐

