我写了一个简短的Codepen,我试图改变一个临时数组,同时保留原来的数组,但我的两个数组都被改变了。
有人可以解释我的问题是什么吗?
var x = ["x"];
abc(x);
function abc(x){
for(var i = 0; i < 3; i++) {
var y = x;
y.unshift("y");
console.log(y);
console.log(x);
}
}
输出:
["y", "x"]
["y", "x"]
["y", "y", "x"]
["y", "y", "x"]
["y", "y", "y", "x"]
["y", "y", "y", "x"]
提前致谢。
答案 0 :(得分:1)
没有内部数组。内存中只有一个数组对象。 x
和y
只是对单个数组实例具有相同引用的不同变量,因为您已将x
的值分配给y
,这是一个参考而那个引用只是被复制了。
如果您想使用数组副本,可以使用slice
函数。
var x = ["x"];
abc(x);
function abc(x) {
var y = x.slice();
for(var i = 0; i < 3; i++) {
y.unshift("y");
console.log('Array y: ' + y);
console.log('Array x: ' + x);
}
}
答案 1 :(得分:0)
Javascript通过引用处理对象。因此,如果您编写var y = x
,它不会复制您的对象,而是复制参考。因此,当您更新y
时,它会同时更新x
。
如果要复制对象,可以执行以下操作:
var y = JSON.parse(JSON.stringify(x))