拷贝,浅拷贝与深拷贝的区别如下:

  • 如果拷贝的对象里的元素只有值,没有引用类型,那浅拷贝和深拷贝没有差别,新对象和原对象相互独立,不受影响;
  • 如果拷贝的对象里的元素包含引用类型, 对于浅拷贝,它虽然将原有对象复制一份,但是依然保存的是引用,所以对新对象里的引用里的值进行修改,会改变原对象的值,新对象和原对象没有完全分离开;
  • 如果拷贝的对象里的元素包含引用类型, 对于深拷贝,它会将原对象里的引用也新创建一个列表,然后放的是新列表的引用,新对象和原对象完全分离开。

一、拷贝

赋值是拷贝,但不是浅拷贝,这是两个概念  --- 基本数据类型是按值传递,而引用数据类型传递是内存中的地址

//1.1 基本数据类型
var a=10;
var b=a;
b=520;    //修改b,a不变
console.log(a); //10
console.log(b); //520//1.2 引用数据类型
var a={name:"Roddy",age:21};
var b=a;
b.age=18;  //修改b对象的age属性,但a对象的age属性也随之变化
console.log(a); //{name: "Roddy", age: 18}
console.log(b); //{name: "Roddy", age: 18}

二、浅拷贝

function Clone(oldobj){if (typeof oldobj !== "object")  return oldobj;//判断是数组,还是对象,根据结果创建数组还是对象let newObj = oldobj instanceof Array ? [] : {};for (let key in oldobj) {if (oldobj.hasOwnProperty(key)) {newObj[key] = oldobj[key];}}return newObj;
}
var a = 10;
var b = Clone(a);
b=13;       //修改b,a不变
console.log(a); // 10
console.log(b); // 13
console.log("------------------------------");
var c={name:"Roddy",age:21};
var d=Clone(c);
d.age=18;   //修改d对象的age属性(基本类型),但c对象的age属性不变化
console.log(c); // {name:"Roddy",age:21};
console.log(d); // {name:"Roddy",age:18};
console.log("------------------------------");
var e={name:"Roddy",ld:{age:21,sex:"男"}};
var f=Clone(e);
f.ld.sex="女";   //修改f对象的ld属性(引用类型)的sex属性,但e对象的ld属性的sex属性变化
console.log(e); // {name:"Roddy",ld:{age:21,sex:"女"}};
console.log(f); // {name:"Roddy",ld:{age:21,sex:"女"}};

三、深拷贝

function deepClone(oldobj){if (typeof oldobj !== "object")  return oldobj;//判断是数组,还是对象,根据结果创建数组还是对象let newObj = oldobj instanceof Array ? [] : {};for (let key in oldobj) {if (oldobj.hasOwnProperty(key)) {newObj[key] = deepClone(oldobj[key]); //执行递归拷贝}}return newObj;
}
var a = 10;
var b = deepClone(a);
b=13;    //修改b,a不变
console.log(a); // 10
console.log(b); // 13
console.log("------------------------------");
var c={name:"Roddy",age:21};
var d=deepClone(c);
d.age=18;    //修改d对象的age属性(基本类型),但c对象的age属性不变化
console.log(c); // {name:"Roddy",age:21};
console.log(d); // {name:"Roddy",age:18};
console.log("------------------------------");
var e={name:"Roddy",ld:{age:21,sex:"男"}};
var f=deepClone(e);
f.ld.sex="女";   //修改f对象的ld属性(引用类型)的sex属性,但e对象的ld属性的sex属性不变化,这一点不同于浅拷贝
console.log(e); // {name:"Roddy",ld:{age:21,sex:"男"}};
console.log(f); // {name:"Roddy",ld:{age:21,sex:"女"}};

拷贝,浅拷贝与深拷贝三者的区别相关推荐

  1. 对象浅拷贝和深拷贝有什么区别与实现方法

    在JS中,除了基本数据类型,还存在对象.数组这种引用数据类型. 基本数据类型有number,string,boolean,null,undefined五类. 基本数据类型 名值存储在栈内存中 当b=a ...

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

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

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

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

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

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

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

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

  6. python深浅拷贝 面试_[面试题二]百度资深面试官:python赋值、浅拷贝与深拷贝

    内存管理相关的面试一直是面试中的重点考察内容.赋值.深拷贝与浅拷贝是日常编码工作中,需要时常关注的知识点.不小心可是会写出bug哦- 赋值 先来看一段代码,下面两段代码的输出结果会是什么呢? # ca ...

  7. 拷贝构造(浅拷贝,深拷贝)

    空类中默认的函数有   默认的构造函数,析构,拷贝构造(浅拷贝),operator= 1.   什么是拷贝构造?        第一个参数 是当前这个类的 const类型的引用  的构造函数 2.   ...

  8. clone是深拷贝还是浅拷贝_Cloneable接口的作用与探索理解浅拷贝与深拷贝

    导读:本文将主要讨论设计模式--原型模式中,关于cloneable接口及浅拷贝与深拷贝的概念. 原型模式的理解 关于原型模式的理解,我在网上发现一个有趣且助于理解原型模式的例子在这里分享一下:火影忍者 ...

  9. C#中的浅拷贝和深拷贝

    C#中有两种类型变量,一种是值类型变量,一种是引用类型变量.对于前者,copy是属于全盘复制:而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样.因此对于后者进行真正copy的时候 ...

最新文章

  1. 汇编语言关于8086CPU多种寻址方式总结
  2. 系统科学丨钱学森:我对系统学认识的历程
  3. 异步任务-AsyncTask
  4. 天气预报c是什么意思_大雪节气将至,为什么老话说:寒风迎大雪,三九天气暖?...
  5. 程序猿值得看的几个技术网站(记录)
  6. python中if语句的实例_Python基础入门-IF语句
  7. 【FPGA基础】四位二进制--格雷码转换器(vivado)
  8. 基于springboot+mysql的房地产中介管理系统
  9. FPGA零基础学习:Intel FPGA 开发流程
  10. 洛谷-2028 龙兄摘苹果
  11. python 聚宽 对股票名称或代码进行查询
  12. 卡罗拉更换变速油教程
  13. 天堂2mysql_天堂2单机版 L2J-som-rotm 安装全过程及常用工具 一步到位
  14. DOS上登陆FTP的命令和步骤(ftp命令全集)
  15. 如何让一个IFRAME调用页面的背景为透明
  16. LWIP netconn TCP UDP测试 实例
  17. GIT | GIT命令大全
  18. Vue组件之间的传参方式小总结
  19. java-php-python-ssm-蔚蓝在线学习平台2021计算机毕业设计
  20. java io 深入浅出

热门文章

  1. ⾃噬标记物NBR1和p62 ELISA试剂盒
  2. 小程序 onPageScroll监听滚动结束
  3. 2021-2027全球及中国游泳池水循环系统行业研究及十四五规划分析报告
  4. 编译、安装rdesktop 1.8.3
  5. fetchall函数php,PHP PDO fetchAll(),简单结果
  6. linux awk 排序,使用awk对字段进行排序和排列
  7. 前端数据模拟的几种方法
  8. 什么是加密数字货币 加密数字货币的发展前景
  9. Html5align属性弃用解决对齐问题方案
  10. msvc命令行编译静态库和动态库