什么是深拷贝与浅拷贝
浅拷贝:
对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。注意:当内存销毁的时候,只想对象的指针,必须重新定义,才能够使用
代码:
var a = {x:1}
var b = a
console.log(b);//{x:1}
b.x = 2
console.log(b)//{x:2}
console.log(a)//{x:2}
浅拷贝是一个传址,也就是把a的值赋给b的时候同时也把a的址赋给了b,当b(a)的值改变的时候,a(b)的值同时也会改变
深拷贝:深拷贝是指,拷贝对象的具体内容,二内存地址是自主分配的,拷贝结束之后俩个对象虽然存的值是一样的,但是内存地址不一样,俩个对象页互相不影响,互不干涉
深拷贝的几种方法:
1、JSON内置的方法
var a={x:1}
var b=JSON.parse(JSON.stringfiy(a))
console.log(b)//{x:1}
b.x=2
console.log(b)//{x:2}
console.log(a)//{x:1}
原理:该方法是用JSON.parse将对象转为字符串,然后在用JSON.stringify转回对象json字符串转换为对象的时候,会自己去构建新的内存地址存放数据
注:如果对象属性为function,因为JSON格式字符串不支持function,在构建的时候会自动删除
2、Object的内置方法assign
var a={x:1}
var b=Object.assign({}, a);
console.log(b); //{x:1}
b.x = 2;
console.log(b); //{x:2}
console.log(a); //{x:1}
原理:该方法是用Object.assign对对象进行拼接, 将后续对象的内容插入到第一个参数指定的对象,不会修改第一个参数之后的对象,而我们将第一个对象指定为一个匿名空对象,实现深拷贝
注:对象嵌套层次过深,超过2层,就会出现浅拷贝的状况,比如echarts组件的option对象
3、递归实现
function clone(Obj) {首先,然后确定递归的回调,最终到达对象或者数组的末端,达到深拷贝的要求。var newObj; if (Obj instanceof Array) { //确定类型newObj = []; // 创建一个空的数组var i = Obj.length;while (i--) {newObj[i] = clone(Obj[i]); //递归回调}return newObj;} else if (Obj instanceof Object){ //确定类型newObj = {}; // 创建一个空对象for (var k in Obj) { // 为这个对象添加新的属性newObj[k] = clone(Obj[k]); //递归回调}return newObj; //结束函数完成深拷贝}else{return Obj; //结束函数完成深拷贝}}
或者
function extendDeepCopy(obj,newobj){var newobj=newobj||{};for(var i in obj){if(typeof obj[i]=='object'){ //确定类型newobj[i]=(obj[i].constructor==="Array")?[]:{};extendDeepCopy(obj[i],newobj[i]); //递归回调}else{newobj[i]=obj[i];}}return newobj;//结束函数完成深拷贝
}
什么是深拷贝与浅拷贝相关推荐
- Python 精选笔试面试习题—类继承、方法对象、包管理、闭包、可变类型作为默认参数、列表引用、sort与sorted、 append 和 extend、深拷贝和浅拷贝
1. 类继承 如下代码 class A(object):def show(self):print 'This is calss A'class B(A):def show(self):print 'T ...
- C++深拷贝与浅拷贝
浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值.但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件..当 值拷贝的时候,两个对象就有用共同的资源,同时对资源可以 ...
- python的深拷贝与浅拷贝
对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制⼀份内容. 两个变量的内容其实为一个地址,如果要在复制的同时分配新的地址则需要用到深拷贝和浅拷贝的命令 ls ...
- 详谈Javascript中的深拷贝和浅拷贝
数据复制是我们编程中经常会使用到的技术,对于普通数值数据来说,复制很简单,但是对于复杂类型比如对象的复制,就会有很多需要考虑的东西,比如我们经常说到的深拷贝和浅拷贝. 浅拷贝 复制的对象和原始对象属性 ...
- python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝
在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用.为了生成这个副本,就产生了拷贝. ...
- c++深拷贝和浅拷贝
C++中类的拷贝有两种:深拷贝,浅拷贝:当出现类的等号赋值时,即会调用拷贝函数 一:两个的区别 1 在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数--即浅拷贝,它能够完成成员的一一复制.当 ...
- 更清晰的认识对象——深拷贝与浅拷贝
对象在引用的时候引用的是对象的地址,所以导致如果修改其中一个对象,就会对其他引用这个地址的对象进行修改,这种结果并不是我们想要的,这个时候我们就要用到深拷贝和浅拷贝去解决这个问题了. var a = ...
- 深拷贝与浅拷贝~动态内存释放有关
浅拷贝就是对象的数据成员之间的简单赋值,如你设计了一个没有类而没有提供它的复制构造函数,当用该类的一个对象去给令一个对象赋值时所执行的过程就是浅拷贝,如: class A{ public: A(int ...
- 深入浅出的“深拷贝与浅拷贝”
js中的浅拷贝与深拷贝,只是针对复杂数据类型(object, Array)的复制问题.浅拷贝和深拷贝都可以实现在已有对象上再生出一份的作用.但是对象的实例是存储在堆内存中然后通过一个引用值只操作对象, ...
- Javascript中的深拷贝和浅拷贝
文章目录 JavaScript中的变量类型 深拷贝和浅拷贝的理解 深拷贝和浅拷贝的实现方式 为什么需要深拷贝和浅拷贝 JavaScript中的变量类型 (1).基本类型 JavaScript中的基本类 ...
最新文章
- Linux-CAN Bus
- css3动画简介以及动画库animate.css的使用
- Webbrowers控件的小技巧
- 制作r710 linux系统盘,记一次云主机系统盘扩容及制作私有镜像的操作步骤
- 全球及中国微生物气溶胶采样器行业十四五”发展规划及运营前景研究报告2021年版
- 亚马逊评价抓取插件_亚马逊运营必备插件
- 免gre美国计算机硕士,美国硕士免GRE/GMAT的学校-计算机篇
- The whole Fiori application is wrapped in a big shell xml view
- 源码安装的php如何启动脚本,PHP源码编译安装管理常用脚本
- mysql设置catalog_Catalog与Schema
- matlab 转换为正整数_【MATLAB】专题1笔记 MATLAB基础知识
- 关于质量标准化的思考和实践
- php中文网 日历,php小型日历类库
- 遇到 oracle 错误 25153,EXP时,出现3113的错误,不知道怎么解决?
- Python编程基础08:循环结构
- 8.霍夫变换:线条——介绍、参数模型、直线拟合_1
- 公司的个性制度与团队精神
- java读取文件buffered_关于Java中使用BufferedReader读取文件的疑惑
- Java中字符串split() 的使用方法
- 20200908:链表类题目集合上