2D数组在JavaScript中产生意外结果
如果我在JavaScript中创建一个2D数组,并尝试分配一个特定的对象,那么它会改变所有内容。这是我的密码:2D数组在JavaScript中产生意外结果,javascript,arrays,Javascript,Arrays,如果我在JavaScript中创建一个2D数组,并尝试分配一个特定的对象,那么它会改变所有内容。这是我的密码: var a = [0,1]; var b = []; b.push(a); b.push(a); b[0][0]=5; alert(b[1][0]); 现在我希望得到0,但我得到5。如何修复此问题?您正在推送的数组是引用,因此两个索引的值都引用a(引用a),这就是为什么任何索引的更改都会反映在指向相同引用的所有其他索引上,您需要添加值,您可以看到我用于创建数组副本的值 b.push(
var a = [0,1];
var b = [];
b.push(a);
b.push(a);
b[0][0]=5;
alert(b[1][0]);
现在我希望得到
0
,但我得到5
。如何修复此问题?您正在推送的数组是引用,因此两个索引的值都引用a
(引用a),这就是为什么任何索引的更改都会反映在指向相同引用的所有其他索引上,您需要添加值,您可以看到我用于创建数组副本的值
b.push([...a]);
var a=[0,1];
var b=[];
b、 推(a);
b、 推动([…a]);
b[0][0]=5;
控制台日志(b)代码>推送相同的对象引用。通过更改一个值,所有引用都会显示更改后的值。相反,您可以通过获取
var a=[0,1];
var b=[];
b、 推(a.切片());
b、 推(a.切片());
b[0][0]=5;
console.log(b[1][0]);
控制台日志(b)编码>通过调用b.push(a)
两次,可以将同一数组a
分配给b
的第一个和第二个索引。因此,如果编辑a
的元素,则它将反映在同一实例的所有引用中
您可以执行a
的深度复制以防止出现这种情况
例如:
b.push(a.slice());
b.push(a.slice());