场景 1:
var myArray = [2, 3, 4, 5];
function doStuff(arr) {
arr = [];
}
doStuff(myArray);
console.log(myArray); // [2,3,4,5]
场景 2:
var myArray = [2, 3, 4, 5];
function doStuff(arr) {
arr.pop();
}
doStuff(myArray);
console.log(myArray); // [2,3,4]
为什么场景 1 不更新全局声明的数组,而场景 2 会更新?
最佳答案
在第一个例子中:
您正在更改变量 arr
,它只是持有对数组 [2, 3, 4, 5]
的引用,所以不是持有对数组的引用[2, 3, 4, 5]
,它将保存对另一个数组 []
的引用。
在 var myArray = [2, 3, 4, 5];
行:
myArray -----------------------------------> [2, 3, 4, 5]
然后在 doStuff(myArray);
行:
myArray -----------------------------------> [2, 3, 4, 5]
↑
arr ----------------------------------------------/
然后在 arr = [];
行:
myArray -----------------------------------> [2, 3, 4, 5]
arr ---------------------------------------> []
=> 所以,在调用 doStuff
之后,myArray
仍然是 [2, 3 , 4, 5]
.
在第二个例子中:
您正在使用存储在 arr
中的对 [2, 3, 4, 5]
的引用来调用其上的函数 pop
改变它。
在 var myArray = [2, 3, 4, 5];
行:
myArray -----------------------------------> [2, 3, 4, 5]
然后在 doStuff(myArray);
行:
myArray -----------------------------------> [2, 3, 4, 5]
↑
arr ----------------------------------------------/
然后在 arr.pop();
行:
myArray -----------------------------------> [2, 3, 4, 5].pop()
↑
arr.pop() ----------------------------------------/
将数组更改为:
myArray -----------------------------------> [2, 3, 4]
↑
arr ----------------------------------------------/
=> 因此,在调用 doStuff
之后,myArray
现在是 [2, 3 , 4]
.
关于javascript - 为什么有些操作不会改变传递给函数的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46259273/