JavaScript数组作为ref传递,但是不能将ref分配给新数组?

时间:2018-11-06 17:30:06

标签: javascript arrays pass-by-reference

如果我将数组传递给函数并在函数内对数组进行更改,则函数外部存在的数组将反映这些效果。例如:

var myArr = [1, 2, 3];
function popAll(arr) {
    while(arr.length) {
        arr.pop();
    }
}
popAll(myArr);
console.log(myArr.length); // prints "0"

但是,如果我尝试重新分配数组引用以指向函数中的另一个数组,则它不会粘住:

var myArr = [1, 2, 3];
function reassign(arr) {
    while(arr.length) {
        arr.pop();
    }
    var newArr = [1,2,3,4,5];
    arr = newArr;
}
reassign(myArr);
console.log(myArr.length); // still prints "0"!!

我想念什么?我希望reassign(...)将引用分配给新数组。

编辑:

我不想返回新数组。我想重新分配传入的参考。另外,我想了解为什么JS具有这种不一致的行为(或者我不太了解这种行为的一致性)。

2 个答案:

答案 0 :(得分:3)

JavaScript中的所有函数调用都是传递值。

这似乎违反直觉,但是如果您认为arr参数本身是一个引用,那么它就更有意义了,因此它是一个按值传递的引用。将newArr分配给arr不会修改旧的引用,它只会更改函数范围内的arr引用。

Zeb Rawnsley pointed out in comments一样,您必须从函数返回新引用,并将外部变量分配给返回值:

var myArr = [1, 2, 3];

function reassign(arr) {
    while(arr.length) {
        arr.pop();
    }
    var newArr = [1,2,3,4,5];
    return newArr;
}

myArr = reassign(myArr);

console.log(myArr.length);

只需指出您不需要传递旧引用或将其清空,一旦myArr最初分配的内存中剩余零个引用,它将自动被垃圾收集:

var myArr = [1, 2, 3];

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

myArr = reassign();

console.log(myArr.length);

答案 1 :(得分:1)

不能将一个数组的值分配给另一个数组,但是可以将一个数组中的元素添加到另一个数组中。

这应该为您解决问题:

var myArr = [1, 2, 3];
function reassign(arr) {
    while(arr.length) {
        arr.pop();
    }
    var newArr = [1,2,3,4,5];
    for(var num in newArr){
        arr.push(num);
    }
}
reassign(myArr);
console.log(myArr.length); //prints 5