为什么有些操作不会改变传递给函数的数组?

3

情境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可以?

4个回答

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]


0
在第一个函数中,你只是重新分配了函数的参数。这对传递的数据没有影响。
在第二个函数中,通过调用pop,你实际上改变了传递的数组。
可以这样想:在
var a = 1
a = 2

数字 1 有被修改吗?没有,只是指向它的引用 a 被改变了。


0

在第一种情况下,您正在进行新的内存分配,而在第二种情况下,您实际上正在修改数组。

因此,在第一种情况下,该值不会被修改。

例如:

var myArrayOne = [2, 3, 4, 5];
function doStuff(arr) {
  arr = [7,8,9]; //assigining a whole new object to the copy 
}
doStuff(myArrayOne);
console.log(myArrayOne); // [2,3,4,5]

// Scenario 2
var myArrayTwo = [2, 3, 4, 5];
function doStuff(arr) {
  arr.pop(); //modifying the internals of the arr object
}
doStuff(myArrayTwo);
console.log(myArrayTwo); // [2,3,4]


0

arr是对数组的引用,该数组存在于内存中的某个位置(您不知道在哪里,也不关心)。当您说arr = []时,您正在创建一个新数组,在内存中的某个位置,并将arr更改为引用该新数组。旧数组仍然存在于内存中。如果没有任何东西参考旧数组,则最终将对其进行垃圾回收,但在这种情况下,它仍然被myArray所引用,因此保持不变。

另一方面,arr.pop()修改了数组,而不是更改引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接