let obj=[1,2,4]
let obj2=Array.from(obj)
obj2[0]=23
console.log(obj)
这是浅拷贝吗?
在给出的例子中,Array.from(obj)
实际上执行的是对数组 obj
的浅拷贝。这是因为数组在JavaScript中是一种特殊的对象,其元素存储在索引属性中。Array.from()
方法创建了一个新的数组实例,并将原数组 obj
的每个元素复制到新数组中。但是,由于数组元素本身(在这个例子中是数字)是基本类型值,它们是按值复制的,而不是按引用复制的。
因此,当您修改 obj2[0]
的值为 23
时,原数组 obj
并未受到影响,因为您没有修改任何对象的引用,只是修改了新数组 obj2
的第一个元素的值。
但是,如果数组 obj
包含的是对象引用(而不是基本类型值),那么 Array.from()
仍然会执行浅拷贝,这意味着新数组 obj2
中的对象引用将指向与原数组 obj
中相同的对象。对这些对象的修改将会影响两个数组。
在您的例子中,由于数组 obj
只包含基本类型值(数字),因此可以说 Array.from(obj)
创建了一个与 obj
完全独立的数组 obj2
,对 obj2
的修改不会影响到 obj
。但这并不改变 Array.from()
执行的是浅拷贝的事实,只是在这个特定的例子中,浅拷贝和深拷贝在行为上没有区别。
基本类型值,是按值复制的,而不是按引用复制的
在JavaScript中,基本类型值(如数字、字符串、布尔值、null
、undefined
、Symbol
以及ES10引入的BigInt
)是按值复制的。这意味着当你将一个基本类型的值赋给一个新的变量时,你实际上是在内存中创建了这个值的一个全新副本,并将新变量的引用指向这个新副本。
对于对象(包括数组、函数、对象字面量等),它们是按引用复制的。但是,当使用 Array.from()
或其他类似的方法(如展开运算符 ...
或 slice()
)来“复制”数组时,虽然数组本身是按引用复制的(即新数组是一个新的数组对象),但数组中的元素(如果它们是对象)则取决于这些元素是基本类型还是对象类型。
- 如果数组中的元素是基本类型,那么这些元素是按值复制的。
- 如果数组中的元素是对象类型(包括其他数组、函数、对象字面量等),那么这些元素实际上是按引用复制的,即新数组中的这些元素引用的是和原数组中相同的对象。
由于数组 obj
只包含基本类型值(数字),因此使用 Array.from(obj)
创建的新数组 obj2
中的元素与原数组 obj
中的元素是完全独立的。对 obj2
中元素的任何修改都不会影响 obj
中的元素。
let obj=[1,2,4,{name:'张三',age:18}]
let obj2=Array.from(obj)
obj2[3].name='引用数据类型,按引用复制'
console.log(obj)
//输出[ 1, 2, 4, { name: '引用数据类型,按引用复制', age: 18 } ]
修改了复制的会影响原来的
标签:obj2,obj,按值,复制,引用,数组,拷贝,Array From: https://blog.csdn.net/kjl536566/article/details/139548298