假设我有一个数组,var Animals = ["dog","cat","rat"];
然后我定义var pets = Animals;
然后我调用pets.shift();
现在,因为 javascript 是数组的引用传递,所以如果我现在调用 animals
,我会得到 ["cat","rat"]
。
我的问题:如果我以后想以未修改的形式使用 animals
,有什么办法可以解决这个问题吗?
最佳答案
术语说明:JavaScript 永远 pass-by-reference (无论你听多少次人们这么说)。当你写下这一行时:
var pets = animals;
您正在将动物
的值分配给宠物
。分配的值是对数组的引用,因此现在两个变量引用内存中的同一个对象。 (注意:这有点迂腐,但它也有一个正确的优点。)
如果您希望这两个变量引用两个不同的数组,那么您需要创建原始数组的副本并将对该副本的引用分配给 pets
。在 JavaScript 中执行此操作的最常见方法是利用某些数组方法(例如 slice
或 concat
)创建数组的副本,并在其中创建数组的副本。重新调用:
var pets = animals.concat();
不等式证明:
var arr = [];
arr1 = arr;
console.log(arr1 === arr); // true
console.log(arr1 === arr.concat()) // false
当然,你也可以自己进行复制:
function copy(arr) {
var i, len = arr.length, arr1 = new Array(len);
for (i = 0; i < len; i += 1) {
arr1[i] = arr[i];
}
return arr1;
}
确实,this is probably a lot faster对于非常大的数组应该考虑。 (在大多数情况下,只需执行最具可读性的操作即可。)
请注意,每个方法都会创建原始数组的浅副本。如果数组保存对其他对象的引用,则这些引用将复制到新数组(即原始数组和新数组都将引用相同的对象)。另一方面,字符串和数字被直接复制到新数组中。
关于javascript 通过引用传递解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21238628/