Nodejs:更改数组而不参考更改。为什么?

时间:2018-04-02 00:47:09

标签: javascript arrays node.js

抱歉,我是节点js的新手。如果查看ListComp数组,它在while循环后已经更改。有人可以解释这段代码有什么问题吗?

function FormGrp() {
 var ListOne = [];
 var ListTwo = [];
 var count = 0;
 var Control;
 var graph = [];
 var ListComp = [[59],[73,41],[52,40,9],[26,53,6,34],[10,51,87,86,81]];

 Control = 4;
 console.log(ListComp);

 while(Control != 0){
       ListOne = ListComp[count];
       ListTwo = ListComp[count+1];
       for(var i=0; i<ListOne.length; i++){
            for(var j=0; j<ListTwo.length; j++){
              if(j === 2){
                  ListTwo.shift();
                  break;
                }
                graph.push([ListOne[i],ListTwo[j]]);
            }
       }
       count++;
       Control--;
 }
    console.log('\n',ListComp);
}

在两个控制台输出中,值不同,但我没有在ListComp数组中使用任何模拟方法,它怎么可能被更改?

enter image description here

1 个答案:

答案 0 :(得分:0)

它会发生变化,因为对象是通过引用复制的,而在Javascript中,Array是一个对象。因此,如果您更改副本,原始副本也会受到影响。

考虑到ListComp是一个数组数组,这意味着如果您在ListComp中复制其中一个数组,则通过引用复制它们。例如,在这一行:

ListOne = ListComp[count]

在第一次迭代中,您通过引用数组[59]来复制数组ListOne

让我们看一个只有一个简单数组的例子:

const arr = [1, 2, 3];
const arrCopy = arr;
arrCopy.push(4)
console.log(arr); // [1, 2, 3, 4]
console.log(arrCopy); // [1, 2, 3, 4]

解决问题的一种快速方法是使用Array#slice()clone数组:

 ListOne = ListComp[count].slice();
 ListTwo = ListComp[count+1].slice();

但是,以不需要创建克隆的方式构建代码可能会更好。