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
”所指向的数组。在第一个示例中,第三行正在创建一个新数组。第二个示例没有创建新数组。在第二个示例中分配数组时,是通过引用传递它们。数组不是克隆的或重复的,而是由两个变量引用的