Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么将新数组赋给变量会更改其引用而不是值?_Javascript_Arrays - Fatal编程技术网

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

Javascript 为什么将新数组赋给变量会更改其引用而不是值?,javascript,arrays,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.lo

我想知道为什么如果我在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"]
为什么对数组的引用没有更新

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

两者都可以创建全新的阵列

之后

copyOfArray
array
指的是同一个数组
secondArray
指的是不同的数组

当你现在打字的时候

array = secondArray;
然后
array
不再引用第一个数组。相反,它指的是第二个数组 — 对于同一数组
secondArray
引用
copyOfArray
仍然引用第一个数组,因为变量尚未更改。被称为
secondArray
的数组引用只传递给
array
,而不是
copyOfArray

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

两者都可以创建全新的阵列

之后

copyOfArray
array
指的是同一个数组
secondArray
指的是不同的数组

当你现在打字的时候

array = secondArray;
然后
array
不再引用第一个数组。相反,它指的是第二个数组 — 对于同一数组
secondArray
引用
copyOfArray
仍然引用第一个数组,因为变量尚未更改。被称为
secondArray
的数组引用只传递给
array
,而不是
copyOfArray

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

当您这样做时:

var array = ["1","2","3"];
var copyOfArray = array;   
这将创建一个数组并使
copyOfArray
指向同一个实例

数组
-->实例a
copyOfArray
-->instanceA

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

var secondArray = ["2","3","4"];
数组
-->实例a
copyOfArray
-->instanceA
secondArray
-->实例b

现在做 数组=第二个数组

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

数组
-->实例b
copyOfArray
-->instanceA
secondArray
-->实例b

这是有意义的,因为当您执行以下操作时,您指向的是
secondArray
指向的引用,而不是
secondArray
本身:

var array = ["1","2","3"];
var copyOfArray = array;   
这将创建一个数组并使
copyOfArray
指向同一个实例

数组
-->实例a
copyOfArray
-->instanceA

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

var secondArray = ["2","3","4"];
数组
-->实例a
copyOfArray
-->instanceA
secondArray
-->实例b

现在做 数组=第二个数组

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

数组
-->实例b
copyOfArray
-->instanceA
secondArray
-->实例b


这很有意义,因为您指向的是
secondArray
指向的参考,而不是
secondArray
本身

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

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

文档

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

发布示例

var array = ["1","2","3"];
var copyOfArray = array;
使array和copyOfArray保留对同一数组对象的引用,该对象在内存中的位置只有javascript引擎知道

var secondArray = ["2","3","4"];
array = secondArray;
创建另一个数组对象,并在secondArray和Array中设置对该对象的引用。将新引用存储在
数组中
重写已有的数组引用值。但是,存储在copyOfArray中的参考值尚未更改

因此,
secondArray
的日志显示
[“2”、“3”、“4”]
但会离开
copyOfArray
holding
[“1”、“2”、“3”]
设计

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

Javascript采用了
操作符,以便在访问时简化语法