[英]javascript pass by reference workaround
假设我有一个数组, var animals = ["dog","cat","rat"];
然后我定义var pets = animals;
然后我打电话给pets.shift();
现在因为javascript是数组的传递引用,如果我现在调用animals
,我得到["cat","rat"]
。
我的问题:如果我以后想以未经修改的形式使用animals
,有什么方法吗?
关于术语的说明:JavaScript 永远不会 通过引用传递 (无论你听到有多少人说过它)。 写行时:
var pets = animals;
你正在为pets
分配animals
的价值 。 分配的值是对数组的引用,因此现在两个变量都引用内存中的同一对象。 (注意:这有点迂腐,但它也有正确的好处 。)
如果您希望这两个变量引用两个不同的数组,那么您需要创建原始数组的副本并为pets
分配对它的引用。 在JavaScript中最常用的方法是利用一些数组方法(如slice
或concat
)创建调用它们的数组的副本这一事实:
var pets = animals.concat();
in / equality的证明:
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;
}
实际上, 这可能要快得多 ,应该考虑用于非常大的阵列。 (在大多数情况下,只做最可读的事情。)
请注意,这些方法中的每一个都会创建原始数组的浅表副本。 如果数组保存对其他对象的引用,则将这些引用复制到新数组(即原始数组和新数组都将引用相同的对象)。 另一方面,字符串和数字将直接复制到新数组中。
你必须克隆数组,这是完成的
var savedAnimals = animals.slice();
请注意,这不是深度克隆:它不保护内部元素不受修改(如果它们不是字符串)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.