javascript 通过引用传递解决方法

标签 javascript pass-by-reference

假设我有一个数组,var Animals = ["dog","cat","rat"];

然后我定义var pets = Animals;

然后我调用pets.shift();

现在,因为 javascript 是数组的引用传递,所以如果我现在调用 animals,我会得到 ["cat","rat"]

我的问题:如果我以后想以未修改的形式使用 animals ,有什么办法可以解决这个问题吗?

最佳答案

术语说明:JavaScript 永远 pass-by-reference (无论你听多少次人们这么说)。当你写下这一行时:

var pets = animals;

您正在将动物分配给宠物。分配的值是对数组的引用,因此现在两个变量引用内存中的同一个对象。 (注意:这有点迂腐,但它也有一个正确的优点。)

如果您希望这两个变量引用两个不同的数组,那么您需要创建原始数组的副本并将对该副本的引用分配给 pets。在 JavaScript 中执行此操作的最常见方法是利用某些数组方法(例如 sliceconcat)创建数组的副本,并在其中创建数组的副本。重新调用:

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/

相关文章:

等效于 LINQ Any() 的 JavaScript/jQuery

php,按引用或按值的变量

c++ - 当我需要通过指针传递时(而不是通过引用传递)

reference - D语言中不能通过引用传递

javascript - 每个单元测试都会调用 Angular module.run 方法

javascript - 调试时如何按 z-index 对页面元素进行排序?

c - 当我们可以选择使变量成为外部变量时,为什么我们要通过引用传递?

java - Java ArrayList中的对象不会更新

javascript - jQuery:相同标记名的元素位置/索引

javascript - 在 JavaScript 中重新排列表格