2017-09-16 37 views
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呢?

回答

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]

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 ---------------------------------------> [] 

=>所以,后致电doStuffmyArray仍然是[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

arr是对数组的引用,它存在于内存中某处(您不知道在哪里,而且您不在乎)。当你说arr = []时,你正在内存中的某个地方创建一个新数组,并将arr更改为引用该新数组。旧的数组仍然存在于内存中。如果没有指向旧数组的话,那么它最终会被垃圾收集,但在这种情况下,它仍然被myArray引用,因此它保持不变。

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

相关问题