为什么将新数组赋值给变量更改其引用而不是值?

时间:2016-03-13 20:39:55

标签: javascript arrays

我想知道为什么如果我在JS中运行它,它将在我更改其值后创建对该数组的新引用:

var array = ["1","2","3"];
var copyOfArray = array;              
console.log(copyOfArray);  // ["1", "2", "3"]
var secondArray = ["2","3","4"];
array = secondArray;
console.log(array); //["2","3","4"]
console.log(copyOfArray); //["1", "2", "3"]

为什么对数组的引用没有更新?

3 个答案:

答案 0 :(得分:2)

当你这样做时:

var array = ["1","2","3"];
var copyOfArray = array;   

这将创建一个数组并使copyOfArray指向同一个实例

  

array - > instanceA
  copyOfArray - > instanceA

创建第二个数组将创建一个新实例,而前两个数组指向旧实例:

var secondArray = ["2","3","4"];
  

array - > instanceA
  copyOfArray - > instanceA
  secondArray - > instanceB

现在正在做     array = secondArray;

array指向的引用更新为secondArray指向的引用,以便您拥有

  

array - > instanceB
  copyOfArray - > instanceA
  secondArray - > instanceB

当您指向secondArray 指向参考时,这是有道理的,而不是指向secondArray本身

答案 1 :(得分:1)

var array = ["1","2","3"];

var secondArray = ["2","3","4"];

都创建了全新的数组。

var copyOfArray = array;

copyOfArrayarray指的是同一个数组; secondArray指的是不同的数组。

现在输入

array = secondArray;

然后array不再引用第一个数组。相反,它引用第二个数组 - 指向同一个数组secondArraycopyOfArray仍然引用第一个数组,因为该变量尚未更改。被称为secondArray的数组引用仅传递给array,而不传递给copyOfArray

换句话说,在array = secondArray;之后,第一个数组与变量array之间的链接已断开。这两者之间没有联系,更重要的是arraycopyOfArray之间没有联系。

答案 2 :(得分:0)

<强>设计

C语言使用点运算符.来访问结构值标识符之后的结构和联合数据成员,但在指向结构的指针之后使用->运算符以访问其成员。

Javascript在访问对象属性时采用.运算符以简化语法,但在将对象存储在变量中并传递给函数时使用指针值。 javascript代码无法访问指针的值,无论是内存地址还是javascript引擎使用的某种表的索引。

<强>文档

Javascript文档通常声明所有参数数据类型都按值传递给函数。这只是在变量中的对象值是引用的意义上,并且当传递给函数或在另一个变量中设置时,仅复制对象引用值而不复制对象的数据结构。

发布示例

var array = ["1","2","3"];
var copyOfArray = array;

使数组和copyOfArray都保持对同一个Array对象的引用,该对象在内存中的位置只能由javascript引擎知道。

var secondArray = ["2","3","4"];
array = secondArray;

创建另一个Array对象,并在secondArray和array中设置对它的引用。在array中存储新引用会覆盖已存在的数组引用值。但是,存储在copyOfArray中的参考值尚未更改。

所以secondArray的日志会显示["2","3","4"],但会离开 copyOfArray举行["1","2","3"]