对象和数组在 javascript 中作为引用传递或分配,而不是副本。如果你想要一个对象或数组的副本,你必须明确地制作一个副本。
分配或传递时复制更简单的类型,例如数字、布尔值。
字符串有点特殊。它们作为引用传递,但由于字符串是不可变的(无法更改),因此您不能真正将字符串引用用于任何内容,因为任何修改字符串的尝试都会创建一个新字符串。
几个例子:
// arrays assigned by reference
var a = [1,2,3];
var b = a;
a[0] = 0;
alert(b[0]); // alerts 0 because b and a are the same array
// objects assigned by reference
var c = {greeting: "hello"};
var d = c;
c.greeting = "bye";
alert(d.greeting); // alerts "bye" because c and d are the same object
// numbers assigned as copies
var e = 3.414;
var f = e;
e = 999;
alert(f); // alerts 3.414 because f is its own copy of the original number
// make a copy of an array
var g = [1,2,3];
var h = g.slice(0); // h is now a copy
h[0] = 9;
alert(g); // shows [1,2,3]
alert(h); // shows [9,2,3]
将参数传递给函数或从函数返回值也是如此。除非创建显式副本,否则数组和对象通过引用传递或返回。
可以使用该.slice()方法制作数组的浅拷贝。
var arr1 = [1,2,3];
var arr2 = arr1.slice(0); // make independent copy of first array
可以通过将每个属性从原始对象复制到新对象来制作对象的浅拷贝。
深拷贝涉及测试被复制的每个项目的类型,如果它是对象或数组,则在对象上递归,因此嵌套的对象和数组也被复制。