JavaScript - 通过引用传递但在重新分配时丢失的数组

时间:2016-05-16 09:22:24

标签: javascript pass-by-reference

在下面的JS代码中,为什么f3(arr2) arr2改为f2(arr1)arr1所做的更改?是否有任何方法可以使f3按预期工作(如果可能,不返回修改后的数组)?

var arr1 = [1, 2, 3, 4];
var arr2 = [1, 2, 3, 4];

function f1() {
    return [2, 3, 4, 5];
}

function f2(arr) {
    arr.push(5);
}

function f3(arr) {
    arr = f1();
}

f2(arr1);
console.log(arr1); // [ 1, 2, 3, 4, 5 ]

f3(arr2);
console.log(arr2); // [ 1, 2, 3, 4 ], expect [2, 3, 4, 5]

4 个答案:

答案 0 :(得分:2)

如果要修改数组,则实际上必须修改数组。你不能只是在变量上写一个不同数组的引用(因为它只会丢弃对该数组的本地引用)。

function f3(arr) {
    arr.length = 0; // Empty the array
    f1().forEach(function (currentValue) { arr.push(currentValue); });
}

答案 1 :(得分:2)

引用:" console.log(arr2); // [1,2,3,4],期待 [2,3,4,5]"

你没有得到你期望的原因是这部分

function f3(*arr*) { *arr* = f1(); }

您正在将数组[2,3,4,5]分配给函数 f3 arr > ,而不是arr2。在整个剧本中,Arr2当然仍未被触及并处于原始状态。

function f3(*arr*) { *arr2* = f1(); }会这样做。

但这个答案不是我的决定。这只是它的出现方式。

答案 2 :(得分:1)

你可以一步完成:

Array.prototype.splice.apply(arr, [0, arr.length].concat(f1()));

var arr1 = [1, 2, 3, 4];
var arr2 = [1, 2, 3, 4];

function f1() {
    return [2, 3, 4, 5];
}

function f2(arr) {
    arr.push(5);
}

function f3(arr) {
    Array.prototype.splice.apply(arr, [0, arr.length].concat(f1()));
}

f2(arr1);
document.write('<pre>' + JSON.stringify(arr1, 0, 4) + '</pre>');

f3(arr2);
document.write('<pre>' + JSON.stringify(arr2, 0, 4) + '</pre>');

答案 3 :(得分:-1)

当你传递任何东西时(无论是对象还是原始),所有javascript都会在函数内部分配一个新变量...就像使用等号(=)

该参数在函数内的行为方式与您使用等号分配新变量时的行为完全相同。请参阅这些简单示例。 您可以参考:Link