在JS中,除了基本数据类型,还存在对象、数组这种引用数据类型。

基本数据类型有number,string,boolean,null,undefined五类。

基本数据类型
名值存储在栈内存

当b=a复制时,栈内存会新开辟一个内存

  //基本数据类型的拷贝let a = 1;let b = a;console.log(a);a = 2;//此时修改a不会影响bconsole.log(b);


引用数据类型
名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值。

 let o1 = {a:1}let o2 = o1;o2.a = 2;console.log(o1.a); //2


当对 o2.a = 2; 时进行修改时,由于o1与o2指向的是同一个地址,所以自然o1也受了影响,这就是所谓的浅拷贝了。

基本数据类型,拷贝是直接拷贝变量的值,而引用类型拷贝的其实是变量的地址。

在这种情况下,如果改变o1或o2其中一个值的话,另一个也会变,因为它们都指向同一个地址

而浅拷贝和深拷贝就是在这个基础上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行了引用的传递,而没有重新创建一个对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个对象,并且复制期内的成员变量,则认为是深拷贝

怎么去实现深拷贝呢?

  1. 使用递归去复制所有层级属性
//深拷贝实现方式//第一种
function deepCopy(obj) {//生成新对象let objCopy = Array.isArray(obj)?[]:{};if(obj && typeof obj === "object"){for(let key in obj){if(obj.hasOwnProperty(key)){//判断ojb子元素是否为对象,如果是,递归复制if(obj[key] && typeof obj[key] === "object"){objCopy[key] = deepCopy(obj[key]);}else{//如果不是直接复制objCopy[key] = obj[key];}}}}return objCopy;
}let obj1 = {a:{b:1}
}
console.log(obj1);let obj2 = deepCopy(obj1);obj1.c = {d:2
};
//obj2不受obj1的影响
console.log(obj2);


2. 借用JSON对象的parse和stringify

 //第二种借助JSON.parse() 和 JSON.stringify()function deepCopy(obj) {let _obj = JSON.stringify(obj);let objCopy = JSON.parse(_obj);return objCopy;}let obj3 = {a:{b:10}}console.log(obj3);let obj4 = deepCopy(obj3);obj3.c = {d:20};//obj4不受obj3的影响console.log(obj4);

以上就是个人对对象浅拷贝和深拷贝有什么区别与实现方法的见解,希望可以帮助到大家!

部分参考来源:https://blog.csdn.net/weixin_41910848/article/details/82144671

对象浅拷贝和深拷贝有什么区别与实现方法相关推荐

  1. int** 赋值_Python的赋值、浅拷贝、深拷贝之间的区别

    这里用三张图来说清Python的赋值.浅拷贝.深拷贝之间的区别. 补充说明: 1.首先要理解 不可变数据.可变数据类型: 2.对于其他语言(如JAVA)的浅拷贝.深拷贝逻辑相同: 3.下图所描述的数据 ...

  2. 拷贝,浅拷贝与深拷贝三者的区别

    拷贝,浅拷贝与深拷贝的区别如下: 如果拷贝的对象里的元素只有值,没有引用类型,那浅拷贝和深拷贝没有差别,新对象和原对象相互独立,不受影响: 如果拷贝的对象里的元素包含引用类型, 对于浅拷贝,它虽然将原 ...

  3. js对象浅拷贝与深拷贝

    一.简介    浅拷贝是拷贝一层,如果数据是基本数据类型,会拷贝其本身,如果除了基本数据类型之外还有一层对象,那么只能拷贝其引用,对象的改变会反应到拷贝对象上.    深拷贝是拷贝多层,每一层的数据都 ...

  4. Java中浅拷贝与深拷贝之间的区别

    在深入探讨Java中浅表副本与深表副本之间的差异之前,让我们看看首先进行克隆的是什么. 什么是克隆? 克隆是在内存中创建现有对象的精确副本的过程.在Java中,java.lang.Object类的cl ...

  5. js 对象浅拷贝和深拷贝

    var model={name:"boy",age:13}; var CopyModel=model; console.log(CopyModel.name); model.nam ...

  6. 引用拷贝,浅拷贝,深拷贝之间的区别以及如何实现

    首先我们知道在JavaScript当中数据类型分为基本数据类型和引用数据类型 1.基本数据变类型 :基本数据类型是指直接存放在栈当中的简单数据 数据大小确定 它们是直接按值存放 可以直接按值访问 va ...

  7. js 浅拷贝直接赋值_js的浅拷贝和深拷贝的简单理解和使用方法

    使用js对象赋值给另一个变量的时候默认是传的引用,什么是引用呢,通俗一点讲就是传的是一个指针,当你对被赋值的变量进行操作的时候原来的值也会变动.这个时候就需要深拷贝啦,也就是把对象所有属性都复制一份到 ...

  8. python 实例对象 浅拷贝_Python对象中的浅拷贝和深拷贝

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Python中的赋值语句不会创建对象的副本,而只是给对象绑定了新的名称.对于不可变对象,这通常没什么区别. ...

  9. 引用拷贝、浅拷贝和深拷贝区别

    类型 拷贝一般分为二大类 引用拷贝 和 对象拷贝,我们通常讲的深拷贝和浅拷贝都属于对象拷贝. 引用拷贝 顾名思义,即是对引用地址的拷贝,说明引用地址一样,指向堆中的对象是同一个对象. 如果对一个对象进 ...

最新文章

  1. Containerd 的前世今生和保姆级入门教程
  2. QDir::toNativeSeparators的使用
  3. AndroidUI的组成部分RoomButton
  4. oracle解析失败事件,ORACLE诊断事件及深入解析10053事件
  5. B--Bookshelf 2
  6. 企业库4.0 2008年3月发布的CTP
  7. java 内存分配实例_java学习(四) —— 内存分配浅析
  8. 斯坦福大学CS143编译原理课程笔记:2.编译器结构
  9. linux提示qq不是最终版本,Deepin中QQ出现当前版本存在安全风险,将于2019年10月30日停止使用的解决...
  10. 青春是一场永志的劫数
  11. 过滤文本或字符串中的emoji表情(包括微信自带表情处理)
  12. FTP报550异常-Create directory operation failed
  13. echarts 生成中国陕西省份(或其他省份)的地图,大屏使用
  14. 计算机的音乐怎样弹生日快乐,5 分钟让你学会用吉他弹《生日快乐》歌
  15. SRAM、PSRAM、SPI FLASH
  16. MTK AF如何开启log 录制mobile log 如何full scan(无指令无图片版本)
  17. 华为鸿蒙系统推升级应用名称,华为哪些手机可以用鸿蒙系统?华为手机鸿蒙系统升级名单公布...
  18. 6827台!中移动数据中心交换机采购结果公示 华为、中兴遭滑铁卢
  19. arcmap小技巧之获取行政区划及json格式转shp,json转csv
  20. python爬取pubmed的文献_爬虫获取pubmed中文献的标题和摘要

热门文章

  1. 一个基于PoS共识算法的区块链实例解析(升级版)
  2. 彻底理解 Raft 共识算法及 etcd/raft 源码解析
  3. python数圈算法_Python实践|围圈数数多人运动
  4. 【从入门到进阶】vim基础配置+ 常用插件(NERDTree, cscope, rainbow等)
  5. ajax对接接口属性,ajax调用restful接口
  6. ViewDragHelper (三)- 打造仿陌陌视频播放页(深入篇)
  7. i5 10300h和i5 1135g7 参数对比 哪个好
  8. java jframe 设置背景图片_JFrame如何在原有的界面添加背景图片啊
  9. git报错:refusing to merge unrelated histories 的解决方法
  10. Xcode教程 Xcode4发布测试 打包Archive操作