什么是深拷贝什么是浅拷贝,两者区别

发布于:2025-05-11 ⋅ 阅读:(66) ⋅ 点赞:(0)

什么是深拷贝什么是浅拷贝,两者区别

1.深拷贝

递归复制对象的所有层级,嵌套的引用类型属性,最后生成一个完全独立的新对象,与原对象无任何引用关联。

特点:

新对象和原对象的所有层级属性是独立的(修改不会相互影响)

2.浅拷贝

只复制对象的第一层属性,如果属性是引用类型(引用数据类型放在堆中,优先级)

如果属性是基本数据类型,浅拷贝会复制这些值。如果属性是引用数据类型,浅拷贝是只复制复制他们的内存地址,这就意味着新对象和原对象数据共享同一块内存中的引用对象

特点:原对象和新的对象第一层(基本数据类型)属性是相互独立的,但是深层(引用数据类型)属性是共享的(修改会互相影响)

实现方法

1、扩展运算符
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { ...obj1 };
obj2.a = 3;
obj2.b.c = 4;
console.log(obj1.a); // 1
console.log(obj1.b.c); // 4,同样被修改了,此处反应是浅拷贝,深拷贝不会发生改变
2、Object.assign
const obj2 =Object.assign({},...obj1)
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = Object.assign({}, obj1);
obj2.a = 3;
obj2.b.c = 4;
console.log(obj1.a); // 还是1,说明obj1的a属性没变
console.log(obj1.b.c); // 变成4了,所以obj1的b对象被修改了,是浅拷贝,而深拷贝是相互独立的
3、数组浅拷贝(slice、concat、展开运算符)
concat()	连接两个或多个数组,不影响原数组	返回一个新的数组
slice()	数组复制slice(begin、end)	返回被截取项目的新数组,不影原数组

3.两者区别

应用场景

何时使用浅拷贝?

浅拷贝适用于以下情况:

性能要求较高:浅拷贝复制速度快,因为它只复制基本数据类型和引用,而不复制引用对象本身。

对象结构简单:如果对象只包含不可变对象或没有多层次的嵌套引用,浅拷贝足以满足需求。

共享数据的场景:在某些情况下,需要多个对象共享相同的数据,以减少内存使用。例如,缓存数据的共享,浅拷贝可以使得多个对象共享相同的引用。

何时使用深拷贝?

深拷贝适用于以下情况:

数据独立性要求高:在需要确保原始对象和复制对象完全独立的情况下,深拷贝是必要的。这避免了一个对象的改变影响到另一个对象。

复杂数据结构:对于具有复杂嵌套引用的对象,深拷贝确保所有层次的引用对象都被复制,保证数据的完整性。

并发编程:在多线程环境中,深拷贝可以防止线程之间的相互干扰,提高程序的安全性和稳定性。

优缺点比较

浅拷贝的优缺点

优点:

速度快,效率高:因为只复制引用,浅拷贝的操作速度更快,占用的内存更少。
实现简单:浅拷贝通常只需简单的赋值操作,易于实现和维护。
缺点:

不独立:浅拷贝对象中的引用指向与原对象相同的内存区域,修改一个对象可能影响另一个对象,导致数据一致性问题。
易产生难以察觉的Bug:由于共享同一引用,可能在不经意间导致数据的修改,出现难以察觉的Bug。

深拷贝的优缺点

优点:

数据独立性强:深拷贝确保新对象与原对象完全独立,修改一个对象不会影响另一个对象,保证数据的安全性和独立性。
适用于复杂数据结构:深拷贝可以处理具有嵌套引用的复杂对象,确保复制后的对象数据完整。
缺点:

实现复杂:深拷贝需要递归复制所有引用对象,编写代码时容易出错,增加了代码的复杂性。
性能开销大:深拷贝需要分配新的内存空间,复制对象的过程较慢,占用更多的内存资源。


网站公告

今日签到

点亮在社区的每一天
去签到