JavaScript实现数组元素重复两次时报堆内存溢出如何解决?
报错原因
你编写的代码出现内存溢出报错的核心原因是循环终止条件设计错误:
- 第一个for循环的终止条件为
i != arr.length,但循环体内部每次执行arr.push(arr[i])都会让数组的长度arr.length自增1 - 循环变量i每次只自增1,而
arr.length同步持续变大,导致i永远无法满足和arr.length相等的终止条件,进入无限循环 - 无限循环会持续往数组中插入新元素,数组占用的内存空间越来越大,最终超出JavaScript堆内存上限,触发分配失败报错。
解决方案
下面提供3种可实现数组元素重复两次的可行方案:
方案1:缓存原始数组长度(修改原有循环逻辑)
提前存储数组修改前的原始长度,让循环只遍历初始状态下的所有元素:
var arr = [1,2]; // 缓存数组初始长度 var initialLength = arr.length; for(var i = 0; i < initialLength; i++) { arr.push(arr[i]); } for(var i = 0; i < arr.length; i++) { console.log(arr[i]); }
方案2:使用concat方法(最简实现)
直接调用数组原生concat方法拼接原数组自身,一行代码即可实现需求:
var arr = [1,2]; arr = arr.concat(arr); // 输出验证 arr.forEach(item => console.log(item))
方案3:使用ES6扩展运算符
通过扩展运算符展开原数组两次,拼接为新数组:
var arr = [1,2]; arr = [...arr, ...arr]; // 输出验证 arr.forEach(item => console.log(item))
内容的提问来源于stack exchange,提问作者Ajay kumar soni
相关产品推荐
相关产品推荐

