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

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

首先明确一点,浅拷贝和深拷贝的概念,是因为栈堆内存的设计产生了,所以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对象值改变不会影响到原来对象。浅拷贝会影响

相关文章
|
9月前
|
Java
【面试题精讲】深拷贝和浅拷贝区别了解吗?什么是引用拷贝?
【面试题精讲】深拷贝和浅拷贝区别了解吗?什么是引用拷贝?
|
2月前
|
存储 人工智能 前端开发
深拷贝浅拷贝的区别?如何实现一个深拷贝?
深拷贝浅拷贝的区别?如何实现一个深拷贝?
|
2月前
|
C++
C++什么是深浅拷贝,深浅拷贝的区别?
C++什么是深浅拷贝,深浅拷贝的区别?
|
2月前
|
存储 JSON JavaScript
10分钟深入探讨带你彻底理解浅拷贝与深拷贝
在JavaScript中,对象的拷贝是一项常见的操作。浅拷贝和深拷贝是两种常用的拷贝方式。浅拷贝只复制对象的引用,而深拷贝创建了一个全新的对象,包含与原始对象相同的值和结构。深拷贝和浅拷贝各有适用的场景和注意事项。本文将详细介绍如何实现一个完整而优雅的深拷贝函数,处理循环引用和特殊类型,优化性能,并探讨深拷贝和浅拷贝的应用场景、注意事项和相关属性。
|
2月前
|
存储 Java Apache
【面试问题】深拷贝和浅拷贝的区别?
【1月更文挑战第27天】【面试问题】深拷贝和浅拷贝的区别?
|
12月前
面试官:深拷贝与浅拷贝有啥区别?
面试官:深拷贝与浅拷贝有啥区别?
|
8月前
|
JavaScript
一文弄懂浅拷贝和深拷贝
一文弄懂浅拷贝和深拷贝
33 0
|
11月前
|
存储 JavaScript 前端开发
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
65 0
|
人工智能 JavaScript 前端开发
为什么要用深浅拷贝、什么是深浅拷贝、以及如何实现
首先我们要明白一点,js中数据类型分为: 基本数据类型 (Number, String, Boolean, Null, Undefined, Symbol) 对象数据类型 ( Object )** 引用数据类型的值是保存在栈内存和堆内存中的对象。栈区内存保存变量标识符和指向堆内存中该对象的指针。当寻找引用值时,解释器会先寻找栈中的地址。然后根据地址找到堆内存的实体
80 0
为什么要用深浅拷贝、什么是深浅拷贝、以及如何实现

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    27
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    27
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    27
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    28
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    25
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    31
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    22
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    20
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    21
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    20