深拷贝和浅拷贝的理解与应用
2018-03-22 11:33
176 查看
深拷贝和浅拷贝的理解与应用
对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的部分或全部 数据。JavaScript中有两种类型的对象拷贝:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)。深拷贝与浅拷贝的区别
深复制和浅复制最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用。浅复制 —-只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“(浅复制)浅拷贝”,换句话说,浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。深复制 —-在计算机中开辟了一块新的内存地址用于存放复制的对象。浅拷贝实例
//此递归方法不包含数组对象 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
深拷贝实例
而深复制则不同,它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制到新对象上。这就不会存在上面 obj 和 shallowObj 的 arr 属性指向同一个对象的问题。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和obj2分别拥有不同的内存地址,两边值的改变互不影响。深浅拷贝也可以使用JQuery的extend方法,注意使用合并返回值let newObj = $.extend(true,{},partcontent);转载自:http://blog.csdn.net/u014628388/article/details/77489400
相关文章推荐
- Javascript 深拷贝与浅拷贝理解与应用
- 理解卷及神经网络应用在自然语言处理的学习笔记
- iOS10通知框架UserNotification理解与应用
- js replace() 方法的应用和理解
- SVN的子命令SVN merge详解,应用两组源文件的差别到工作拷贝路径
- 理解HTTP session原理及应用
- Spring的RequestMapping的理解及应用
- javascript权威指南第五版 读后有感!!(读这本书之后的一些理解,和恍然大悟的感觉)包括闭包,继承和应用
- 理解与应用LDAP服务器
- 大家都说是水题。。好吧,那我就从水题开始做。。自己独立的做。正好最近在辅导大二的数据结构,自己也加强下对栈的理解和应用。 第一次那么完全的独立完成OJ的题,激动呐!读题目理解就废了我好多的时间,虽说英语过了
- php中的钩子理解及应用
- 理解零拷贝
- 理解HTTP session原理及应用
- 一步步学习SPD2010--第十二章节--理解可用性和可接入性(1)--应用以用户为中心的方法论
- 【算法复习】理解拓扑排序原理和应用
- 无密码拷贝应用到目标开发板的操作
- ThreadLocal的理解与在Spring中的应用
- Android Window理解(2)---应用窗口创建过程
- 关系运算类系统函数样例以及绑定函数的理解应用
- 市委组织部考核项目——我对JSON的理解与应用