为什么要用深浅拷贝、什么是深浅拷贝、以及如何实现
一、深拷贝和浅拷贝
首先我们要明白一点,js中数据类型分为:
基本数据类型 (Number, String, Boolean, Null, Undefined, Symbol)
对象数据类型 ( Object )
引用数据类型的值是保存在栈内存和堆内存中的对象。栈区内存保存变量标识符和指向堆内存中该对象的指针。当寻找引用值时,解释器会先寻找栈中的地址。然后根据地址找到堆内存的实体。
二、为什么要进行深浅拷贝
首先看下如下代码
let a = b = 2
a = 3
console.log(a)
console.log(b)
let c = d = [1,2,3]
let e = f = {a:1,b:2,c:3}
c[0] = 2
e.a = 2
console.log(d[0])
console.log(f.a)
会发现,同一个Array或者Object赋值给两个不同变量时,变量指向的是同一个内存地址,所以就会造成其中一个变量改变属性值,同时改变了另外一个变量的对应属性值。
而大多数实际项目中,我们想要的结果是两个变量(初始值相同)互不影响。所以就要使用到拷贝(分为深浅两种)
三、深浅拷贝的区别:
浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化会导致原始对象中的对应字段也发生变化。
深拷贝是在引用方面不同,深拷贝就是创建一个新的和原始字段的内容相同的字段,是两个一样大的数据段,所以两者的引用是不同的,之后的新对象中的引用型字段发生改变,不会引起原始对象中的字段发生改变。
结果:
一次构造
两次析构
编译系统在我们自己没有自定义拷贝构造函数时,会在拷贝对象时候调用默认拷贝构造函数,进行浅拷贝,即对指针name拷贝后出现两个指针指向同一个内存块。所以析构时候就析构了两次,导致内存泄漏。
所以在对“含有指针成员的对象”进行拷贝时,必须要自己定义拷贝构造函数,使拷贝构造后的对象指针成员有自己的内存空间,即进行深拷贝,避免内存泄漏。
test.cpp
结果:
构造一次
拷贝构造一次
析构两次
在这里插入图片描述
综上所述,浅拷贝是只对指针进行拷贝,两个指针指向同一个内存块,深拷贝是对指针和指针指向的内容都进行拷贝,拷贝后的指针是指向不同内的指针。
深拷贝和浅拷贝是针对复杂数据类型来说的,浅拷贝只拷贝一层,而深拷贝是层层拷贝。
深拷贝
深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。 深拷贝后的对象与原来的对象是完全隔离的,互不影响,
对一个对象的修改并不会影响另一个对象。
浅拷贝
浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。
可 以 使 用
for in 、
Object.assign 、
扩 展 运 算 符 …
Array.prototype.slice()、
Array.prototype.concat() 、递归等递归函数实现深拷贝
针对这一共性的深浅拷贝问题,我也是略施小计,进行了一点皮毛性的总结吧,希望能给大家带来一定地方帮助,那么我的总结也是有效果的。
欢迎进群探讨技术交流
群号:954314851 或者扫码进群,期待每一位大牛的加入
为什么要用深浅拷贝、什么是深浅拷贝、以及如何实现相关推荐
- 17.深浅拷贝和写时拷贝
深浅拷贝 浅拷贝只拷贝指针,但拷贝后两个指针指向同一个内存空间: 深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针指向两个不同地址. 当类成员不包括指针何引用时,浅拷贝并无问题 ...
- 【Android RTMP】x264 图像数据编码 ( NV21 格式中的 YUV 数据排列 | Y 灰度数据拷贝 | U 色彩值数据拷贝 | V 饱和度数据拷贝 | 图像编码操作 )
文章目录 安卓直播推流专栏博客总结 一. NV21 图像数据中的 YUV 数据简介 二.向 x264 编码图片 三. 提取 NV21 数据中的灰度数据 Y 四. 提取 NV21 数据中的饱和度数据 U ...
- nio java 内核拷贝_大文件拷贝,试试NIO的内存映射
最近项目里有个需求需要实现文件拷贝,在java中文件拷贝流的读写,很容易就想到IO中的InputStream和OutputStream之类的,但是上网查了一下文件拷贝也是有很多种方法的,除了IO,还有 ...
- 拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元
1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: ...
- 【C++grammar】析构、友元、拷贝构造函数、深浅拷贝
目录 1.Destructor(析构函数) 在堆和栈(函数作用域与内嵌作用域)上分别创建Employee对象,观察析构函数的行为 2.Friend(友元) 1.为何需要友元 2.友元函数和友元类 3. ...
- Git仓库只拷贝代码-不拷贝提交记录-不拷贝其他分支
1.背景 想拷贝代码到内网开发环境,因为网速很慢,所以希望Git仓库只拷贝代码-不拷贝提交记录-不拷贝其他分支.因为我直接拷贝压缩一个项目居然有1G的内容, 2.重要步骤 复制一个项目,拷贝粘贴 3. ...
- java的深浅拷贝_Java中深浅拷贝
一,浅拷贝 ①对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象.因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得 ...
- php深浅拷贝,js实现深浅拷贝方法
说起深浅拷贝,我觉得需要理清楚 值类型 和 引用类型,本文主要和大家分享js实现深浅拷贝方法,希望能帮助到大家. 值类型 所谓 值类型 就是 undefined,null,number, string ...
- python怎么设置颜色深浅变化_python之深浅拷贝
python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果,其实这个是由于共享内存导致的结果 拷贝:原则上就是把数据分离出来,赋值其数据,并以后修改互不影 ...
- python拷贝文件函数_Python Set集合,函数,深入拷贝,浅入拷贝,文件处理
1.Set基本数据类型 a.set集合,是一个无序且不重复的元素集合 classset(object):"""set() -> new empty set obje ...
最新文章
- halcon算子翻译——set_framegrabber_param
- 理解ASP.NET Core中的中间件
- 避免延迟的JPA集合
- C# 文本操作类 Trim() 和Replace()的用法小例子
- 用户故事与敏捷方法 - 第二章 编写故事
- 知了课堂 python_知了课堂 Python Flask零基础 笔记整理
- kmeans聚类算法python实现_Python实现Kmeans聚类算法
- Java替换第一个和最后一个字符串
- 山东省计算机软件比赛,山东省大学生软件设计大赛报名通知
- 利用python openpyxl库实现对多个excel工作簿的快速汇总
- openGL控制FPS (每秒传输的帧数)
- 矩阵分析与应用-1.10-Hadamard积与Kronecker积
- oracle 19c的卸载与安装
- 微信小程序5——小程序网络数据请求
- 星座 member.php,计算 星座 PHP
- 宜家将首次参与天猫618购物节;3M启动上海结构胶国产化二期扩产项目 | 美通企业日报...
- win11共享文件夹设置在哪?win11共享文件夹设置方法
- IE6下png背景不透明——张鑫旭博客读书笔记
- sql中下划线的转义
- namp安装及官方使用手册翻译及注释1
热门文章
- 飞凌基于i.MX6Q-C核心板实现膀胱超声测容仪的通信显示方案
- 【模拟电路】温度对器件特性的影响
- 1143 -- 函数解析式
- System32和SysWow64文件夹的区别
- HML_FwLib_8051使用补充说明
- 最简单日柱推算法_日柱的简单计算方法
- 解决 DevExpress21 控件不在工具箱显示问题
- Python面向对象版:学员管理系统(入门级练手)
- Justinmind使用教程(5)——Justinmind破解
- oracle exadata x7发布,没有对比就没有伤害 QData T5完虐Oracle Exadata X7