JavaScript数组作为ref传递,但可以';是否将ref分配给新数组?

JavaScript数组作为ref传递,但可以';是否将ref分配给新数组?,javascript,arrays,pass-by-reference,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

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

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"!!
我错过了什么?我希望
重新分配(…)
将引用分配给新数组

编辑:


我不想返回新数组。我想重新分配传入的引用。另外,我想了解为什么JS的行为看起来不一致(或者我不太了解它是如何一致的)。

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

这将为您带来好处:

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

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

这将为您带来好处:

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

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

这似乎是违反直觉的,但是如果你认为<>代码> ARR < /Cord>参数本身就是一个引用,那么它是一个引用,通过值传递,这就更有意义了。将

newArr
分配给
arr
不会修改旧引用,只会更改函数范围内的
arr
引用

同样,您必须从函数返回新引用,并将外部变量指定给返回值:

var myArr=[1,2,3];
功能重新分配(arr){
while(arr.length){
arr.pop();
}
var newArr=[1,2,3,4,5];
返回newArr;
}
myArr=重新分配(myArr);

控制台日志(myArr.length)JavaScript中的所有函数调用都是按值传递的

这似乎是违反直觉的,但是如果你认为<>代码> ARR < /Cord>参数本身就是一个引用,那么它是一个引用,通过值传递,这就更有意义了。将

newArr
分配给
arr
不会修改旧引用,只会更改函数范围内的
arr
引用

同样,您必须从函数返回新引用,并将外部变量指定给返回值:

var myArr=[1,2,3];
功能重新分配(arr){
while(arr.length){
arr.pop();
}
var newArr=[1,2,3,4,5];
返回newArr;
}
myArr=重新分配(myArr);

控制台日志(myArr.length)将第7行更改为
返回newArr并将第9行更改为
myArr=重新分配(myArr)
@PatrickRoberts感谢您的回答,如果您将其作为完整答案发布,我将很乐意接受。将第7行更改为
返回newArr并将第9行更改为
myArr=重新分配(myArr)
@PatrickRoberts感谢您的回答,如果您将其作为完整答案发布,我将很乐意接受。