浅拷贝与深拷贝
浅拷贝只复制对象的顶层属性(原对象的内存地址),而深拷贝会递归地复制对象及其所有嵌套属性。
实现:
浅拷贝
使用扩展运算符 (...
) 或 Object.assign()
方法可以实现浅拷贝(但目标对象只有一层的时候,是深拷贝)。这两个方法都会创建一个新对象,并复制原对象的可枚举的顶层属性。
例如:
const original = { foo: 'bar', nested: { a: 1 } };
const shallowCopy = { ...original };
shallowCopy
将包含 { foo: 'bar' }
,但 nested
属性将指向原对象的引用。
深拷贝
要实现深拷贝,需要递归地遍历对象并复制其所有属性,包括嵌套对象。可以使用 JSON 序列化和反序列化(结合使用JSON.parse()和JSON.stringify())或第三方库(如 lodash.cloneDeep()
)来实现深拷贝。
例如:
const original = { foo: 'bar', nested: { a: 1 } };
const deepCopy = JSON.parse(JSON.stringify(original));
deepCopy
将包含 { foo: 'bar', nested: { a: 1 } }
的副本,并且 nested
属性指向的是新创建的对象。
区别:
- 浅拷贝只复制顶层属性,而深拷贝会递归地复制所有属性。
- 浅拷贝创建的新对象与原对象共享嵌套对象的引用,而深拷贝创建的新对象完全独立于原对象。
- 浅拷贝的性能通常优于深拷贝,因为不需要递归遍历对象。