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

JavaScript中new Array创建二维数组push元素异常原因及解决方法

为什么用new Array(n).fill([])创建的二维数组,push元素会影响所有索引?

原因分析

当你使用new Array(3).fill([])时,fill方法会将同一个空数组的引用填充到新数组的每一个索引位置。也就是说,数组arr的三个元素指向的是内存中的同一个数组对象。所以当你执行arr[1].push('a')时,实际上是在修改那个共享的数组,结果自然会体现在所有索引上。

而显式写const arr = [[], [], []]时,每一个[]都是独立创建的新数组,各自拥有独立的内存引用,修改其中一个不会影响其他。

简洁的正确实现方式

如果你想要简洁地创建每个元素都是独立空数组的二维数组,可以用以下几种方式:

方式一:使用map方法

const arr = new Array(3).map(() => []);
arr[1].push('a');
console.log(arr);
// [[], ['a'], []]

map会为数组的每个元素执行一次回调函数,每次回调里的[]都是新创建的数组,避免了引用共享。

方式二:使用Array.from

const arr = Array.from({ length: 3 }, () => []);
arr[1].push('a');
console.log(arr);
// [[], ['a'], []]

Array.from可以根据传入的长度参数,通过回调函数为每个位置生成新的空数组,效果和上面一致。

方式三:展开语法结合Array构造函数

const arr = [...new Array(3)].map(() => []);
arr[1].push('a');
console.log(arr);
// [[], ['a'], []]

展开new Array(3)会生成一个由undefined填充的数组,再用map替换每个undefined为新的空数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:36:01