深拷贝与浅拷贝
深拷贝与浅拷贝
深拷贝
对象的深拷贝是指其属性与其拷贝的源对象的属性不共享相同的引用
即深拷贝是值的拷贝,拷贝后的对象与源对象完全独立,互不影响
浅拷贝
对象的浅拷贝是其属性与其拷贝的源对象的属性共享引用 --MDN
即深拷贝是值的地址的拷贝(针对引用类型),拷贝后的对象与源对象会相互影响
浅拷贝:展开语法(...
操作符)、数组的一些API(concat
、slice
、from
)、对象的一些API(assign
、create
)
浅拷贝与直接赋值的区别
直接赋值:
当你直接赋值一个对象或数组时,你实际上是在复制这个对象的引用,而不是对象本身。这意味着原始对象和新对象将指向内存中的同一个位置。因此,对任何一个对象的修改都会影响到另一个对象。
浅拷贝:
浅拷贝则是创建一个新对象,并复制原始对象的所有非静态属性到新对象,同时将这些属性指向原始对象中的相同位置(即复制的是引用,而不是实际的对象)。因此,如果原始对象中的属性值是一个引用类型(如对象或数组),那么新对象和原始对象将共享这个引用。
总结:
直接赋值:复制的是对象的引用,原始对象和新对象指向同一个内存位置。
浅拷贝:创建一个新对象,并复制原始对象的所有非静态属性到新对象。如果属性值是引用类型,则新对象和原始对象将共享这个引用
例如:
// 直接赋值
const orging1 = {
a: 1,
b: {
c: 2
}
}
const tar1 = orging1
tar1.a = 2 // orging.a = 2
tar1.b.c = 3 // orging.b.c = 3
// 浅拷贝
const orging2 = {
a: 1,
b: {
c: 2
}
}
const tar2 = Object.assign({}, orging2)
tar2.a = 2 // orging.a = 1
tar2.b.c = 3 // orging.b.c = 3