我是JavaScript的新手,但我知道JavaScript在传递对象时传递基元和通过引用调用时会按值调用。
var a = [4,5];
var temp = a;
console.log(a); // [4,5] OK
console.log(temp); // [4,5] OK
temp = temp.push(6); // Insert one more element into temp array
console.log(a); // [4,5,6] why so??
Console.log(temp); // [4,5,6]
我知道这是因为参考变了。我该怎么做才能避免深层复制?
如果我改变temp不想改变原始参考a,则应打印[4,5]。
答案 0 :(得分:4)
如果要复制它,可以使用slice:
var temp = a.slice(0);
编辑:感谢cuberto指出我切片(0)
答案 1 :(得分:2)
“我知道JavaScript行为是按原始价值和价值调用的 在对象的情况下通过引用调用。“
不完全是。在Javascript中,所有内容都始终按值传递。如果传递一个对象,则实际传递对该对象的引用,该引用按值传递。
示例:
var o = { name: 'first' };
// pass object reference to a function
use(o);
function use(x) {
// change the reference
x = { name: 'second' };
}
alert(o.name); // shows "first"
当引用按值传递给函数时,更改函数内部的引用不会更改用于发送引用的变量。
在您的代码中,您只有一个数组:
var temp = a; // copy the reference from a to temp
您有两个引用相同数组的变量,因此当您使用另一个变量查看数组时,使用一个变量访问数组所做的任何更改都将可见。
要获得两个独立的数组,您必须专门创建它的副本:
var temp = a.slice(0);
注意:复制数组会产生浅表副本。这意味着,如果你有一个你复制的对象数组,你将有两个数组,但它们仍将共享同一组对象。
答案 2 :(得分:0)
如您所知,原始值按值传递,其他所有值都通过引用传递。基元是布尔值,数字和字符串(这里可能考虑null
和undefined
)。其他一切都是一个对象,并通过引用传递。