包含对象的数组中的浅拷贝与深拷贝



浅拷贝只是在尝试复制和更改复制数组的内容时{数组包含对象而非原始数据类型},原始数组的内容也发生了更改。

在以下情况下,为什么dst[0]={name:"tom"}是深度拷贝而不是浅拷贝(原始数组"src"的内容没有改变(。相反,第二个运算dst[0].name="0";汤姆;正在按预期创建一个浅层副本,并更改src的内容。有人能澄清一下吗?

let src = [{
name: 'brat'
}, {
age: 40
}]
let dst = [...src]

// dst[0]={name:"tom"} 
dst[0].name = "tom";

console.log(`src ${JSON.stringify(src)}`)
console.log(`dst ${JSON.stringify(dst)}`)

这是因为在下一行中,您没有更改src的复制属性,而是重新分配'key'和'value',并用新属性完全替换旧属性。

dst[0]={name:"tom"} 

与这样做相同:

dst[0]={newName:"tom"} 

它被认为是dst的新属性,而不是从src复制的属性,这就是原始对象没有更改的原因,因为这个"name"属性与从原始对象复制的属性不同。

当您使用{name:quot;tom"}将值重新分配给dst时,dst[0]的内存将从堆中释放,并且一个新对象将完全替换gst[0]rc[0]浅层复制的对象不同。

dst[0]={name:"tom"}dst[0].name = "tom";不是副本,它们只是赋值。一个更改dst数组(将新对象设置为第一个元素(,另一个更改第一个对象(为.name属性设置新字符串(。

浅拷贝发生在let dst = [...src]行,如果不更改,则它始终是浅拷贝,其中dst包含与src相同的可变对象。

最新更新