Javascript 为什么一个数组的变异会导致另一个数组的变异?

Javascript 为什么一个数组的变异会导致另一个数组的变异?,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,我创建了一个函数,用于将多个多维数组合并在一起 输入“table”当前是包含在对象中的2个数组,该函数设计为在每次运行命令时运行(我知道不是很有效,但它是用于高中项目的,需要这样做) 打印输入看起来像: [a',1],[b',1],[a',1]] 希望每次运行函数时生成的表都是这样的: [a',2],[b',1]] 它不是递增“可诱惑的[u][1]”,而是递增连接到输入表[0]的数组 打印原始数组[['a',1],'b',1]]时,现在每次运行代码时都会显示“a”递增1 我不知道为什么它每次都递

我创建了一个函数,用于将多个多维数组合并在一起

输入“table”当前是包含在对象中的2个数组,该函数设计为在每次运行命令时运行(我知道不是很有效,但它是用于高中项目的,需要这样做)

打印输入看起来像:

[a',1],[b',1],[a',1]]

希望每次运行函数时生成的表都是这样的:

[a',2],[b',1]]

它不是递增“可诱惑的[u][1]”,而是递增连接到输入表[0]的数组

打印原始数组[['a',1],'b',1]]时,现在每次运行代码时都会显示“a”递增1

我不知道为什么它每次都递增原始数组而不是仅仅递增“tempArray”,有人能给我解释一下为什么它递增原始表吗

另一方面,这是这个函数的错误,如果我注释掉应该将'tentable'增加1的行,原始表不会改变

函数可组合(表){
var=table[0];
对于(var i=1;i])
您需要为每个嵌套数组使用
Array.prototype.slice()
方法


因此,不是
var-tentable=table[0],您需要使用:


var-tentable=表[0]。映射(arr=>arr.slice());
对于多维数组,不能只说
thing=arr[0]
,因为它只返回对值的引用,而不是复制的值

函数可组合(表){
var tentable=表[0]。映射(arr=>arr.slice());//这是更改的行
对于(var i=1;i
注意:我之所以写这个答案,是因为我认为公认的答案没有明确回答您的问题,即为什么修改一个数组会改变另一个数组

如果数组A和B是对同一数组的引用,修改数组A也会修改数组B。

const arrayA=[1]
常数arrayB=arrayA;
arrayB[0]=2;
console.log(arrayA,arrayB);//->[2]   [2]
JavaScript使用对象策略,该策略适用于数组,因为在JavaScript中数组是对象的一种类型。如何在变异对象的同时避免诸如变异其他对象之类的副作用取决于数组中的数据类型

由于JavaScript对原语使用传递值,因此我们可以执行以下操作:

const array2D=[[1]];
常量array1D=[array2D[0][0]];
阵列1d[0]=2;
console.log(array2D,array1D);//->[[1]]   [2]
但是,如果数组包含其他数组,那么我们的问题就会重现

const array3D=[[1]];
常量array2D=[array3D[0][0]];
array2D[0][0]=2;
console.log(array3D,array2D)/->[[[2]]][[2]]
本质上,如果要修改对象的属性,请注意该对象存在哪些引用。如果我在编写JavaScript时考虑到这一点,那么我发现我不会经常遇到这方面的问题

如果您处于严重的绑定中,则可以深度克隆对象以生成新对象,而无需任何引用。这里有一个答案,说明了如何构建深度克隆功能及其问题:


lodash为其提供了一个实用程序

var-tentable=table[0]不复制内部表格;这只是对同一数组的另一个引用。我给你做了一个片段。请使用您的输入创建一个数组。我使用.slice()进行了更改,它仍然增加了原始数组。修复了,我没有意识到它是一个三维数组