抱歉,我是节点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数组中使用任何模拟方法,它怎么可能被更改?
答案 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();
但是,以不需要创建克隆的方式构建代码可能会更好。