Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.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 - Fatal编程技术网

Javascript 数组给出了意外的行为

Javascript 数组给出了意外的行为,javascript,Javascript,我有以下代码: 设arr=[1,2,3,6]; 设arr2=arr arr=[] 控制台日志(arr) console.log(arr2)在javascript数组中数据类型是一种参考数据类型 创建数组时-让arr=[1,2,3,4],创建一个对象[1,2,3,4],其引用保存为arr变量的值 因此,当分配arr2=arr时,存储在arr中的参考值被分配给arr2。这就是为什么当您尝试更新arr2时,arr变量也会得到更新,因为这两个变量引用了同一个对象 在第一个示例中,由于您已经编写了arr

我有以下代码:

设arr=[1,2,3,6];
设arr2=arr
arr=[]
控制台日志(arr)

console.log(arr2)
在javascript
数组中
数据类型是一种
参考数据类型

创建数组时-
让arr=[1,2,3,4],创建一个对象
[1,2,3,4]
,其引用保存为
arr
变量的值

因此,当分配
arr2=arr
时,存储在
arr
中的参考值被分配给
arr2
。这就是为什么当您尝试更新
arr2
时,
arr
变量也会得到更新,因为这两个变量
引用了同一个对象

在第一个示例中,由于您已经编写了
arr=[]
,因此基本上是将一个新数组分配给
arr
变量,它引用了新的
[]
对象。这就是你看到差异的原因

编辑: 详细的解释

例1:

让arr=[1,2,3,4];//arr实际上是存储[1,2,3,4]的内存引用。
设arr2=arr;//现在,arr2还存储[1,2,3,4]的内存引用。
arr=[];//arr现在存储新[]对象的内存引用。
console.log(arr);//日志-[],因为arr正在存储[]的内存引用。
console.log(arr2);//日志-[1,2,3,4],因为arr2正在存储[1,2,3,4]的内存引用。
例2:

让arr=[1,2,3,6];//arr实际上是存储[1,2,3,6]的内存引用。
设arr2=arr;//现在,arr2还存储[1,2,3,6]的内存引用。
arr.push(“新项目”);//[1,2,3,6]对象更改为[1,2,3,6,‘新项’]。arr仍然引用相同的内存。
console.log(arr);//日志-[1,2,3,6,'新项'],因为arr正在存储[1,2,3,6,'新项']的内存引用。
console.log(arr2);//日志-[1,2,3,6,'new item'],因为arr2还存储[1,2,3,6,'new item']的内存引用。

A帮助您更好地理解这个概念。

在javascript
数组中
数据类型是一种
参考数据类型

创建数组时-
让arr=[1,2,3,4],创建一个对象
[1,2,3,4]
,其引用保存为
arr
变量的值

因此,当分配
arr2=arr
时,存储在
arr
中的参考值被分配给
arr2
。这就是为什么当您尝试更新
arr2
时,
arr
变量也会得到更新,因为这两个变量
引用了同一个对象

在第一个示例中,由于您已经编写了
arr=[]
,因此基本上是将一个新数组分配给
arr
变量,它引用了新的
[]
对象。这就是你看到差异的原因

编辑: 详细的解释

例1:

让arr=[1,2,3,4];//arr实际上是存储[1,2,3,4]的内存引用。
设arr2=arr;//现在,arr2还存储[1,2,3,4]的内存引用。
arr=[];//arr现在存储新[]对象的内存引用。
console.log(arr);//日志-[],因为arr正在存储[]的内存引用。
console.log(arr2);//日志-[1,2,3,4],因为arr2正在存储[1,2,3,4]的内存引用。
例2:

让arr=[1,2,3,6];//arr实际上是存储[1,2,3,6]的内存引用。
设arr2=arr;//现在,arr2还存储[1,2,3,6]的内存引用。
arr.push(“新项目”);//[1,2,3,6]对象更改为[1,2,3,6,‘新项’]。arr仍然引用相同的内存。
console.log(arr);//日志-[1,2,3,6,'新项'],因为arr正在存储[1,2,3,6,'新项']的内存引用。
console.log(arr2);//日志-[1,2,3,6,'new item'],因为arr2还存储[1,2,3,6,'new item']的内存引用。

A可以帮助您更好地理解这个概念。

将引用数组的变量想象为指向某物的箭头(这就是人们谈论引用类型时的真正含义)

声明,例如:

let arr = [1,2,3,6];
可以理解为:创建一个包含四个元素的数组(
[1,2,3,6]
),并让名为“
arr
”的变量指向它

let arr2 = arr
然后意味着,创建一个名为“
arr2
”的变量,让它指向我们已经拥有的四个元素的相同数组

您的两个示例之间的差异现在变得更容易理解:

arr = []
读作:创建一个空数组,并使“
arr
”指向它。这并没有说任何关于“
arr2
”的内容,所以我们可以继续指向它所指向的内容

arr.push('new item')

这不会改变任何箭头,而是修改“
arr
”和“
arr2
”所指向的数组。

将引用数组的变量视为指向某个对象的箭头(这就是人们谈论引用类型时的真正含义)

声明,例如:

let arr = [1,2,3,6];
可以理解为:创建一个包含四个元素的数组(
[1,2,3,6]
),并让名为“
arr
”的变量指向它

let arr2 = arr
然后意味着,创建一个名为“
arr2
”的变量,让它指向我们已经拥有的四个元素的相同数组

您的两个示例之间的差异现在变得更容易理解:

arr = []
读作:创建一个空数组,并使“
arr
”指向它。这并没有说任何关于“
arr2
”的内容,所以我们可以继续指向它所指向的内容

arr.push('new item')

这不会更改任何箭头,而是修改“
arr
”和“
arr2
”所指向的数组。

在第一个示例中,第三行正在创建一个新数组。第二个示例没有创建新数组。在第二个示例中分配数组时,是通过引用传递它们。数组不是克隆的或重复的,而是由两个变量引用的