我想知道为什么如果我在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"]
为什么对数组的引用没有更新?
答案 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;
copyOfArray
和array
指的是同一个数组; secondArray
指的是不同的数组。
现在输入
array = secondArray;
然后array
不再引用第一个数组。相反,它引用第二个数组 - 指向同一个数组secondArray
。 copyOfArray
仍然引用第一个数组,因为该变量尚未更改。被称为secondArray
的数组引用仅传递给array
,而不传递给copyOfArray
。
换句话说,在array = secondArray;
之后,第一个数组与变量array
之间的链接已断开。这两者之间没有联系,更重要的是array
和copyOfArray
之间没有联系。
答案 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"]