作者:Mike丶

https://www.cnblogs.com/mikeCao/p/8710837.html

对象的复制实体,而不是引用。

假设B复制了A,修改A的时候,看B是否发生变化:

如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)

如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)

浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,

深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,

使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。

浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。

深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。

浅拷贝实例:

//此递归方法不包含数组对象var obj = { a:1, arr: [2,3] };var shallowObj = shallowCopy(obj);function shallowCopy(src) {var newobj = {};for (var prop in src) {if (src.hasOwnProperty(prop)) {      newobj[prop] = src[prop];    }  }return newobj;}

因为浅复制只会将对象的各个属性进行复制,并不会进行递归复制,而JavaScript存储对象是存地址的,所以浅复制会导致Obj.arr和shallowObj.arr指向同一块内存地址:

导致的结果就是:

shallowObj.arr[1] = 5;console.log(obj.arr[1]);     //5

深拷贝实例:

var obj = {a:1,arr: [1,2], nation : '中国',birthplaces:['北京','上海','广州']};var obj2 = {name:'杨'};obj2 = deepCopy(obj,obj2);console.log(obj2);//深复制,要想达到深复制就需要用递归function deepCopy(o, c){var c = c || {};for(var i in o){if(typeof o[i] === 'object'){if(o[i].constructor === Array){//这是数组 c[i] = []; }else{//这是对象 c[i] = {}; } deepCopy(o[i], c[i]); }else{ c[i] = o[i]; } }return c;}

而深复制则不同,它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制到新对象上。这就不会存在obj和shallowObj的arr属性指向同一个对象的问题。

这样obj1和obj2分别拥有不同的内存地址,两边的值改变互不影响。

--------------------------------------------------------------------------------------------------------------------------

浅拷贝实现:

var a = [1, 2, 3, 4, 5];var b = a;a[0] = 2console.log(a);console.log(b);//因为b浅拷贝a, ab指向同一个内存地址(堆内存中存的值)//b会随着a的变化而变化//[2, 2, 3, 4, 5]//[2, 2, 3, 4, 5]

深拷贝实现:

function deepClone(obj){var newObj = obj instanceof Array ? []:{};if(typeof obj !== 'object') {return obj; }else{for(var i in obj) { newObj[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i]; } }return newObj;}

var a = [1, 2, 4, 6, "a", "12", [1, 2]];var b = deepClone(a);a[3] = 7;console.log(a);console.log(b);
//b对象并没有因为a对象的改变而改变,因为b深拷贝a[ 1, 2, 4, 7, 'a', '12', [ 1, 2 ] ][ 1, 2, 4, 6, 'a', '12', [ 1, 2 ] ]

精彩推荐

  • Java学习路线图!!!

  • Java1234 VIP特价!!!

  • 锋哥带你java从入门到上班!!!

长按关注锋哥微信公众号,非常感谢;

浅拷贝和深拷贝的区别_深拷贝和浅拷贝的区别相关推荐

  1. 华为p10和p10plus区别_华为p10和p10plus区别,华为p10和p10 plus有什么区别?

    华为p10和p10 plus有什么区别?华为p10和p10plus区别对比怎样?华为在上海举办旗舰新品发布会盛典,正式在中国市场推出华为P10和P10 Plus两款新品.那么华为P10和华为P10Pl ...

  2. python 实例方法和类方法的区别_实例方法和类方法的区别 python

    展开全部 有区别的,最主要的区别在于,定32313133353236313431303231363533e58685e5aeb931333363363433义类方法主要是要加一个装饰器,@classm ...

  3. 交换机和路由器的区别_路由器与交换机的区别?

    路由器与交换机的区别? 路由器与交换机 计算机网络往往由许多种不同类型的网络互连连接而成.如果几个计算机网络只是在物理上连接在一起,它们之间并不能进行通信,那么这种"互连"并没有什 ...

  4. 双通道和单通道区别_实测内存通道的区别:单通道比双通道内存更有优势?

    每当我们部署服务器的时候,经常会遇到一个问题,就是需要多少内存?是需要一根RAM还是两根但其容量与单根相同的RAM? 大多数可能第一反应都是觉得最好是选择两根RAM,这样的话就可以利用双通道内存的优势 ...

  5. 数仓和mysql的区别_数据库和数据仓库的区别和联系

    数据库与数据仓库的区别和联系https://www.zhihu.com/video/1252167793992593408 在以往我们和客户的沟通过程中,大家经常会问到这样的一个问题,数据库和数据仓库 ...

  6. python生成器和迭代器区别_生成器、迭代器的区别?

    迭代器是一个更抽象的概念,任何对象,如果它的类有 next 方法和 iter 方法返回自己本身,对于 string.list. dict.tuple 等这类容器对象,使用 for 循环遍历是很方便的. ...

  7. 单模光纤和多模光纤的区别_多模光纤和单模光纤的区别与应用

    一.多模光纤 当光纤的几何尺寸远远大于光波波长时,光纤中会存在着几十种乃至几百种传播模式.不同的传播模式具有不同的传播速度与相位,导致长距离的传输之后会产生时延.光脉冲变宽.这种现象叫做光纤的模式色散 ...

  8. 工业相机与民用相机的区别_工业相机和普通相机的区别详解

    在机器视觉迅猛发展的今天,工业相机作为机器视觉的核心组件已得到广泛应用,但是很多初学者还是搞不清楚究竟工业相机与普通相机有什么区别.下面小编就带大家一起去看看工业相机和普通相机的区别吧! 工业相机 一 ...

  9. 顺序存取和随机存取的区别_内存和硬盘的区别

    说到电脑内存,很多小伙伴误以为像手机内存卡,相机SD卡一样的存储设备,其实电脑硬盘和内存同样是用来存储数据,那么电脑内存和硬盘到底有什么区别呢?下面让小白系统给你科普下电脑内存和硬盘的区别. 你认识的 ...

最新文章

  1. 初次树莓派遇到的一些小问题
  2. ElasticSearch搜索引擎: 内存分析与设置
  3. Leetcode刷题(2)回文数
  4. 一文讲透数据库,以后别说你不懂数据库
  5. Mac上如何重启或结束Finder进程?
  6. 实现视频播放器倍速、清晰度切换、m3u8下载功能
  7. 灯火阑珊处,都市夜归人
  8. mysql数据库数据表的指令_mysql数据库和表操作命令
  9. smalot-bootstrap-datetimepicker 使用心得
  10. Word转PDF表格边框横线丢失
  11. 数据分析在银行业应用之欺诈检测
  12. 【推荐】工业互联网资料合集
  13. 逻辑学中的思维规律:同一律,不矛盾律,排中律,充足理由律
  14. android 好用的工具,8款好玩实用APP推荐(安卓)
  15. 推荐Arduino更深入学习:《新概念51单片机C语言教程》-郭天祥(文章内含学习资料供下载)
  16. Shell脚本介绍(资源)
  17. CTS测试中testYuvBurst[1]项
  18. e.pageX、e.clientX、e.screenX、e.offsetX的区别以及元素的一些CSS属性
  19. HashMap方法tableSizeFor解析
  20. 【号外】马云这次帮了大忙,银行卡再也不用怕被盗刷!

热门文章

  1. 利用geogle中memory工具分析js占用内存
  2. vue中mixins的使用方法和注意地方
  3. 网桥如何把信号传给服务器,无线网桥传输的三种传输方式
  4. masm5安装教程_汇编语言程序环境搭建masm+debug64位 win10/7
  5. 激活层是每一层都有吗_89小户型复式这样装,每一层都设计得很棒,完工后秒变小区样板间,邻居前来取经...
  6. 简单实现实时输入网页,参考vue底层实现
  7. restful API 常用的四种方式
  8. 如何实现同一个页面里面两个页面的相互切换(window.onscroll)
  9. JavaScript面向对象——深入理解默认的继承方式原型链
  10. TensorFlow:Windows下使用TensorFlow-Python版本