拷贝,浅拷贝与深拷贝三者的区别
拷贝,浅拷贝与深拷贝的区别如下:
- 如果拷贝的对象里的元素只有值,没有引用类型,那浅拷贝和深拷贝没有差别,新对象和原对象相互独立,不受影响;
- 如果拷贝的对象里的元素包含引用类型, 对于浅拷贝,它虽然将原有对象复制一份,但是依然保存的是引用,所以对新对象里的引用里的值进行修改,会改变原对象的值,新对象和原对象没有完全分离开;
- 如果拷贝的对象里的元素包含引用类型, 对于深拷贝,它会将原对象里的引用也新创建一个列表,然后放的是新列表的引用,新对象和原对象完全分离开。
一、拷贝
赋值是拷贝,但不是浅拷贝,这是两个概念 --- 基本数据类型是按值传递,而引用数据类型传递是内存中的地址
//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:"女"}};
拷贝,浅拷贝与深拷贝三者的区别相关推荐
- 对象浅拷贝和深拷贝有什么区别与实现方法
在JS中,除了基本数据类型,还存在对象.数组这种引用数据类型. 基本数据类型有number,string,boolean,null,undefined五类. 基本数据类型 名值存储在栈内存中 当b=a ...
- int** 赋值_Python的赋值、浅拷贝、深拷贝之间的区别
这里用三张图来说清Python的赋值.浅拷贝.深拷贝之间的区别. 补充说明: 1.首先要理解 不可变数据.可变数据类型: 2.对于其他语言(如JAVA)的浅拷贝.深拷贝逻辑相同: 3.下图所描述的数据 ...
- 引用拷贝,浅拷贝,深拷贝之间的区别以及如何实现
首先我们知道在JavaScript当中数据类型分为基本数据类型和引用数据类型 1.基本数据变类型 :基本数据类型是指直接存放在栈当中的简单数据 数据大小确定 它们是直接按值存放 可以直接按值访问 va ...
- Java中浅拷贝与深拷贝之间的区别
在深入探讨Java中浅表副本与深表副本之间的差异之前,让我们看看首先进行克隆的是什么. 什么是克隆? 克隆是在内存中创建现有对象的精确副本的过程.在Java中,java.lang.Object类的cl ...
- 引用拷贝、浅拷贝和深拷贝区别
类型 拷贝一般分为二大类 引用拷贝 和 对象拷贝,我们通常讲的深拷贝和浅拷贝都属于对象拷贝. 引用拷贝 顾名思义,即是对引用地址的拷贝,说明引用地址一样,指向堆中的对象是同一个对象. 如果对一个对象进 ...
- python深浅拷贝 面试_[面试题二]百度资深面试官:python赋值、浅拷贝与深拷贝
内存管理相关的面试一直是面试中的重点考察内容.赋值.深拷贝与浅拷贝是日常编码工作中,需要时常关注的知识点.不小心可是会写出bug哦- 赋值 先来看一段代码,下面两段代码的输出结果会是什么呢? # ca ...
- 拷贝构造(浅拷贝,深拷贝)
空类中默认的函数有 默认的构造函数,析构,拷贝构造(浅拷贝),operator= 1. 什么是拷贝构造? 第一个参数 是当前这个类的 const类型的引用 的构造函数 2. ...
- clone是深拷贝还是浅拷贝_Cloneable接口的作用与探索理解浅拷贝与深拷贝
导读:本文将主要讨论设计模式--原型模式中,关于cloneable接口及浅拷贝与深拷贝的概念. 原型模式的理解 关于原型模式的理解,我在网上发现一个有趣且助于理解原型模式的例子在这里分享一下:火影忍者 ...
- C#中的浅拷贝和深拷贝
C#中有两种类型变量,一种是值类型变量,一种是引用类型变量.对于前者,copy是属于全盘复制:而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样.因此对于后者进行真正copy的时候 ...
最新文章
- 汇编语言关于8086CPU多种寻址方式总结
- 系统科学丨钱学森:我对系统学认识的历程
- 异步任务-AsyncTask
- 天气预报c是什么意思_大雪节气将至,为什么老话说:寒风迎大雪,三九天气暖?...
- 程序猿值得看的几个技术网站(记录)
- python中if语句的实例_Python基础入门-IF语句
- 【FPGA基础】四位二进制--格雷码转换器(vivado)
- 基于springboot+mysql的房地产中介管理系统
- FPGA零基础学习:Intel FPGA 开发流程
- 洛谷-2028 龙兄摘苹果
- python 聚宽 对股票名称或代码进行查询
- 卡罗拉更换变速油教程
- 天堂2mysql_天堂2单机版 L2J-som-rotm 安装全过程及常用工具 一步到位
- DOS上登陆FTP的命令和步骤(ftp命令全集)
- 如何让一个IFRAME调用页面的背景为透明
- LWIP netconn TCP UDP测试 实例
- GIT | GIT命令大全
- Vue组件之间的传参方式小总结
- java-php-python-ssm-蔚蓝在线学习平台2021计算机毕业设计
- java io 深入浅出