1、浅拷贝:
指的是创建一个新对象,其中包含原始对象的引用(指针),并没有真正将原始对象的数据复制到新对象中,因此新对象与原始对象共享部分或全部数据。
2、深拷贝
深拷贝指的是创建一个新对象,并递归地将原始对象的数据复制到新对象中,因此新对象与原始对象之间不存在数据共享。
3、区别:
主要区别在于复制过程中是否会创建新的独立对象以及是否会复制对象内部的内容。
浅拷贝是指在复制过程中,只复制对象本身以及对象内部的引用,而不复制引用指向的具体内容。换句话说,浅拷贝创建了一个新的对象,但该对象与原始对象共享一部分内存。当修改其中一个对象时,另一个对象也会受到影响。
深拷贝则是指在复制过程中,不仅复制对象本身,还复制对象内部的所有内容,包括引用指向的具体内容。深拷贝会创建一个完全独立的新对象,对新对象的修改不会影响原始对象。
4、例子:
在js中:
settingInfo.value.data =attList.value 和 settingInfo.value.data = [...attList.value] 和 settingInfo.value.data = JSON.parse(JSON.stringify(attList.value))的区别
settingInfo.value.data = attList.value
这种方式是直接赋值,也就是说 settingInfo.value.data
和 attList.value 现在指向的是同一个数组,它们共享同一块内存空间。
这意味着,无论你修改哪一个数组,另一个数组也会跟着改变。
settingInfo.value.data = [...attList.value]
这种方式使用了扩展运算符(...),它会创建 attList.value 数组的
一个浅拷贝,然后将这个拷贝赋值给 settingInfo.value.data。
这意味着 settingInfo.value.data 现在指向的是一个新的数组,这个
数组和 attList.value 不共享内存空间。因此,如果你修改
settingInfo.value.data,attList.value 不会改变,反之亦然。
但是,请注意,这是一个浅拷贝,如果数组中的元素是对象(或者其他引用
类型的数据),那么这个拷贝仍然会保留对原对象的引用,所以当
attList.value 中的对象改变时,settingInfo.value.data 中的对
应元素也会改变。
settingInfo.value.data = JSON.parse(JSON.stringify(attList.value))
这种方式会创建 attList.value 数组的一个深拷贝。
这意味着 settingInfo.value.data 现在指向的是一个新的数组,这个数组和
attList.value 不共享内存空间,而且数组中的元素(即使是对象或其他引用
类型的数据)也是完全独立的。也就是说,无论你如何修改
attList.value,settingInfo.value.data 都不会改变。