如果我将数组传递给函数并在函数内对数组进行更改,则函数外部存在的数组将反映这些效果。例如:
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具有这种不一致的行为(或者我不太了解这种行为的一致性)。
答案 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