在一个索引位置更改数组的值也会更改其他位置的值

时间:2015-10-15 10:27:16

标签: javascript arrays multidimensional-array

我正在尝试在索引位置[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]]

任何想法为什么?

1 个答案:

答案 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数组。