我正在尝试在索引位置[0] [0]更改2D数组的值,但[1] [0]处的值也会更改。一种不同的方法在[0] [0]处产生正确的值变化而不影响任何其他值。无法理解2种方法之间的区别。
方法1:
function abc1(){
var dimArr=[2,3];
var arr=[];
var val=0;
for (var i=dimArr.length-1; i>=0; i--)
{
arr = [];
for(var k=0; k<dimArr[i]; k++)
arr.push(val);
val = arr;
}
return arr;
}
方法2:
function abc2(){
var outterArray = [];
for(var i=0; i<2; i++)
{
var innerArray = [];
for(var j=0; j<3; j++)
{
innerArray.push(0);
}
outterArray.push(innerArray);
}
return outterArray;
}
当我运行脚本时:
var d2= abc1();
d2[0][0]='a';
console.log(d2);
var d3= abc2();
d3[0][0]='a';
console.log(d3);
变量d2记录:
[["a", 0, 0], ["a", 0, 0]]
变量d3记录:
[["a", 0, 0], [0, 0, 0]]
任何想法为什么?
答案 0 :(得分:1)
简单来说:
a = [1,2,3];
b = a;
// Only change in array a
a[0] = 10;
// will give you [10, 2, 3] as you set b= a so its points to same address which is a its not a copy of the array its pointing to same array
console.log(b);
如果您选中此问题Copying array by value in JavaScript复制数组默认为引用a
,则会对数组提出异议,并在您说b=a
时允许b
指向同一位置a
指向,但如果您需要按值复制数组,则需要在Post
b = a.slice();
在function abc1()
val
中发生的事情推到了arr
,在第二个循环中你再次推了val
仍然指向同一个数组,所以你拥有的是[指向array1的指针,指向array1的指针,所以它的数组完全相同,所以当你改变值[0][0]
时,它会改变值,而指向同一数组的2指针会显示相同的结果。
正如您在function abc2()
中所看到的那样var innerArray = [];
所以您创建了对新数组的新参考,而不是指向旧的innerArray
数组。