Javascript Slice()不适用于二维数组

Javascript Slice()不适用于二维数组,javascript,arrays,slice,Javascript,Arrays,Slice,我正在尝试使用slice()按值复制二维数组,因此当我更改新数组时,它不会影响原始数组。然而,它似乎是在一维数组上工作,而不是在二维数组上工作 这是我的密码: var arrayA=新数组(5);//制作二维数组 对于(变量i=0;i

我正在尝试使用slice()按值复制二维数组,因此当我更改新数组时,它不会影响原始数组。然而,它似乎是在一维数组上工作,而不是在二维数组上工作

这是我的密码:

var arrayA=新数组(5);//制作二维数组
对于(变量i=0;i<5;i++){
arrayA[i]=新阵列(5);
}
对于(var x=0;x<5;x++){//填充原始数组
对于(变量i=0;i<5;i++){
arrayA[x][i]=x+i;
}
}
arrayB=arrayA.slice();//创建新阵列1
arrayB[0][0]=10;
var arrayC=arrayA.slice();//创建新数组2(希望在使用var时看到它发生更改)
arrayC[0][0]=100;//更改最后一个数组的第一个元素的值
$(文档)。单击(函数(){
警报(arrayA[0][0]);//打印100
警报(arrayB[0][0]);//打印100
警报(arrayC[0][0]);//打印100
});

.slice
复制了单个数组引用,而不是进行深度复制。您可以使用
JSON.parse
JSON.stringify
来满足您的需要:

var arrayA=新数组(5);//制作二维数组
对于(变量i=0;i<5;i++){
arrayA[i]=新阵列(5);
}
对于(var x=0;x<5;x++){//填充原始数组
对于(变量i=0;i<5;i++){
arrayA[x][i]=x+i;
}
}
arrayB=JSON.parse(JSON.stringify(arrayA));
arrayB[0][0]=10;
var arrayC=JSON.parse(JSON.stringify(arrayA));
arrayC[0][0]=100;//更改最后一个数组的第一个元素的值
$(文档)。单击(函数(){
警报(arrayA[0][0]);//打印0
警报(arrayB[0][0]);//打印10
警报(arrayC[0][0]);//打印100
});

这是因为arrayA[0]是指向数组的链接,而不是数组本身,所以

arrayB[0][0]=10
arrayC[0][0]=100更改同一数组,如果需要更改其独立字段,则需要克隆内部数组:

var a = [[0,1,2,3],[0,1,2,3]]
var b = a.slice();
var c = a.slice();
b[0]=b[0].slice();
c[0]=c[0].slice();
b[0][0] = 10
c[0][0] = 100

console.log(a[0][0], b[0][0], c[0][0]);

通常,如果需要深度克隆,最好使用
JSON.parse(JSON.stringify(a))

谢谢!由于我使用stringify,我需要将新数组中的所有值解析回整数吗?不,JSON支持数字、字符串、布尔值和null,但是如果数组中有类似
[1,2,3,undefined,5]
的内容,您应该知道
undefined
将变为
null
。与
Infinity
-Infinity
@MarksCode相同。没必要
.stringify
[1,2,3]
转换为
“[1,2,3]”
。当我使用JSON时,parse
将其恢复为
[1,2,3]
。stringify(arrayA)我的arrayA是否发生了变化,还是与以前一样?如果是这样,我如何将其更改回?谢谢,这不会改变arrayA。如果您运行我的答案中的代码,它会提醒0、10、100。对不起,我忘记更新评论了。