gpt4 book ai didi

JavaScript 数组作为 ref 传递,但无法将 ref 分配给新数组?

转载 作者:行者123 更新时间:2023-11-28 14:26:05 27 4
gpt4 key购买 nike

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

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 会有这种看起来不一致的行为(或者我不太了解它是如何一致的)。

最佳答案

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);

关于JavaScript 数组作为 ref 传递,但无法将 ref 分配给新数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53177025/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com