Javascript 在3D数组中设置一个值会改变其他值

Javascript 在3D数组中设置一个值会改变其他值,javascript,Javascript,我正在一行初始化2x2 3D阵列,其中0为: let matrix = new Array(2).fill(new Array(2).fill(0)); 这导致 [[0,0], [0,0]] 执行矩阵[0][0]=1会导致: [[1, 0],[1, 0]] 这是怎么回事?为什么第0个索引都设置为1?在您的实现中,矩阵是一个包含两个元素的数组,这两个元素是同一个对象。考虑另一个2D数组构造器,它没有这个问题,比如这个问题。 功能零点(宽度、高度){ 矩阵=新阵列(高度); 对于(变量i=

我正在一行初始化2x2 3D阵列,其中0为:

let matrix = new Array(2).fill(new Array(2).fill(0));
这导致

[[0,0], [0,0]]
执行
矩阵[0][0]=1
会导致:

[[1, 0],[1, 0]] 

这是怎么回事?为什么第0个
索引都设置为
1

在您的实现中,矩阵是一个包含两个元素的数组,这两个元素是同一个对象。考虑另一个2D数组构造器,它没有这个问题,比如这个问题。
功能零点(宽度、高度){
矩阵=新阵列(高度);
对于(变量i=0;i
该方法使用静态值填充从开始索引到结束索引的数组的所有元素

在您的例子中,让矩阵=新数组(2).fill(新数组(2).fill(0))
,新数组(2).fill(0)计算一次,它的引用提供给所有外部数组。因此,每个外部数组都引用相同的内部数组。因此,修改一个值就是更新所有其他值

您需要为每一行创建不同的新数组引用。下面的代码为每个索引创建一个新的内部数组

let matrix=Array.from({length:2},=>new Array(2.fill(0));
控制台日志(矩阵);
矩阵[0][0]=1;

控制台日志(矩阵)JS数组是可变的。请参阅。
新数组(2)。填充(0)
只调用一次。想象一下这意味着什么。慢慢来。。。提示:这个游戏只有0个零。这只是一行解决方案的另一种风格:
let matrix=Array.from({length:2},()=>new Array(2.fill(0))
可能的重复(虽然链接是python,但推理是相同的)。