一文搞懂浅拷贝与深拷贝到底有什么区别

简介: 一文搞懂浅拷贝与深拷贝到底有什么区别

首先明确一点,浅拷贝和深拷贝的概念,是因为栈堆内存的设计产生了,所以JavaJavaScriptPython等等,都是有这个概念的!

为了方便,我就直接拿JS来演示了。

创建对象

首先创建一个对象。

var obj = {
     a: 1,
     b: 2,
     c: {
         d: 3,
         e: 4,
     }
 };

这个对象中,还有一个子对象,也就是obj对象中存在对象c

因为如果我们单纯一个对象,js是体现不出来这个浅拷贝与深拷贝的区别的。

如何去实现浅拷贝与深拷贝我就不说了,因为每个语言实现方法不一样,尤其JavaScript可实现方法太多,库也是一大堆,原理说清楚,啥语言都不是问题。

拷贝

//浅拷贝obj
 var obj1 = Object.assign({}, obj);
 //深拷贝obj
 var obj2 = JSON.parse(JSON.stringify(obj));

修改拷贝后对象参数

//修改浅拷贝对象参数的值
 obj1.c.d = 5;
 //修改深拷贝对象参数的值
 obj2.c.e = 6;

注:obj1obj2都是拷贝了obj对象的内容。

此时可能还没有什么差别体现,我们输出一下就明白了。

输出查看差别

console.log('原对象',obj);
 console.log('浅拷贝后对象',obj1);
 console.log('深拷贝后对象',obj2);

看图——>注:我这里是ts写,运行也是用ts-node直接运行,其他语言用其他语言方法。

网络异常,图片无法展示
|

结果如下:

原对象 { a: 1, b: 2, c: { d: 5, e: 4 } }

浅拷贝后对象 { a: 1, b: 2, c: { d: 5, e: 4 } }

深拷贝后对象 { a: 1, b: 2, c: { d: 3, e: 6 } }

//注意看原来定义对象参数
 var obj = {
     a: 1,
     b: 2,
     c: {
         d: 3,
         e: 4,
     }
 };

看看输出后原对象参数——>???为什么输出的原对象的d的值变成了5

再想想,我们是不是给浅拷贝的d重新赋值了个5

思考——>为什么这个5不仅仅是赋值到了obj1,也就是浅拷贝后对象上,赋值到了原对象obj上。

原因是,obj1c这个对象其实不是复制一份obj中的c,而是引用!!!

也就是obj1obj中的c都是指向了——>obj对象创建时在栈堆内存c对象。

我画个图,凑合看看吧:

网络异常,图片无法展示
|

objobj1中的c对象,最终都是指向同一个内存地址。

那既然指向是同一个,那自然改了obj1中的cobjc也改了。

注意!那深拷贝相反,深拷贝它是直接复制的。

它里面的c也是直接新开辟了一个内存,而不是obj原来的c的那块内存,所以obj的c != obj2的c

那你可能会问,怎么样证明是不是同一个呢?

简单!输出一下不就知道了:

console.log(obj.c === obj1.c);
 console.log(obj.c === obj2.c);

结果如下:

网络异常,图片无法展示
|

true

false

可以看出,obj1c指向的内存与objc相同,而obj2c指向的内存与obj的不同。

所以,深拷贝中的c对象值改变不会影响到原来对象。浅拷贝会影响

相关文章
【面试题精讲】深拷贝和浅拷贝区别了解吗?什么是引用拷贝?
【面试题精讲】深拷贝和浅拷贝区别了解吗?什么是引用拷贝?
|
7月前
|
存储 人工智能 前端开发
深拷贝浅拷贝的区别?如何实现一个深拷贝?
深拷贝浅拷贝的区别?如何实现一个深拷贝?
110 0
|
2月前
|
存储
如何理解结构体的浅拷贝与深拷贝
结构体的浅拷贝仅复制对象的引用或基本数据类型值,不创建新对象;深拷贝则会递归地复制所有对象及其引用的对象,形成完全独立的新对象。两者主要区别在于是否共享内部对象。
|
2月前
|
存储 前端开发 JavaScript
浅拷贝和深拷贝的区别?
本文首发于微信公众号“前端徐徐”,介绍了JavaScript中浅拷贝和深拷贝的概念及其实现方法。文章首先解释了数据类型的基础,包括原始值和对象的区别,然后详细介绍了浅拷贝和深拷贝的定义、底层逻辑以及常见的实现方式,如 `Object.assign`、扩展运算符、`JSON.stringify` 和手动实现等。最后,通过对比浅拷贝和深拷贝的区别,帮助读者更好地理解和应用这两种拷贝方式。
84 0
浅拷贝和深拷贝的区别?
|
6月前
|
安全 Java
深拷贝和浅拷贝的区别
深拷贝和浅拷贝的区别
面试官:深拷贝与浅拷贝有啥区别?
面试官:深拷贝与浅拷贝有啥区别?
|
7月前
|
存储 Java Apache
【面试问题】深拷贝和浅拷贝的区别?
【1月更文挑战第27天】【面试问题】深拷贝和浅拷贝的区别?
|
JavaScript
一文弄懂浅拷贝和深拷贝
一文弄懂浅拷贝和深拷贝
54 0
|
存储 JavaScript 前端开发
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
102 0
|
存储 JSON 缓存
前端面试:浅拷贝和深拷贝的区别?
前端面试:浅拷贝和深拷贝的区别?
123 0