繁体   English   中英

javascript通过引用解决方法传递

[英]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中最常用的方法是利用一些数组方法(如sliceconcat )创建调用它们的数组的副本这一事实:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM