码迷,mamicode.com
首页 > 其他好文 > 详细

浅析深拷贝与浅拷贝--【godDie】--

时间:2018-10-06 00:34:53      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:bsp   引用   log   必须   str   数组   type   传递   rip   

--理解深拷贝与浅拷贝,必须要理解值传递与引用传递的概念、

 值传递:传递的是基本数据类型的数据(数据不会发生改变)

 引用传递:传递的是对象(数组、对象)对象存储在堆空间中,自身可以发生改变

 

--浅拷贝及其实现的方式

浅拷贝:
当一个对象拷贝另一个对象的数据的时候,只要一个对象的数据发生改变另一个对象的数据也会发生改变 ,因为浅拷贝拷贝的是引用的地址

实现浅拷贝的方式
第一种方式 要求对象必须是多层的状态下才能实现浅拷贝
//ES6 Object.assign()
参数1:target
参数2:对象......
参数3:对象....   合并对象


第二种方式
利用jq中的插件机制
$.extend()
除了可以给jquery对象扩展方法外还可以实现深浅拷贝

1、布尔值 如果填true的情况下是深考贝 什么也不写就是浅拷贝
2、目标对象
3......后面所有的对象 都是需要合并的对象         

var obj = {a:{name:"张三",age:19}};
var obj1 = {b:{name:"李四",age:19}};

var obj2 = $.extend({},obj,obj1)


第三种方式   要求对象必须是多层的状态下才能实现浅拷贝
function copy(obj){
var newObj = {};
for(var key in obj){
newObj[key] = obj[key];
}

return newObj;
}

  

--深拷贝及其实现的方式

深拷贝
当一个对象拷贝另一个对象的数据的时候,其中一个对象的数据发生变化不会影响另一个对象的数据
因为深考贝拷贝的是对象的数据而不是地址

实现深拷贝的方式
第一种方式 对象是单层的情况下
//Object.assign()
var obj = {a:1,b:2,c:3}
var obj1 = Object.assign({},obj);
obj1.a = 30;
console.log(obj1,obj)

第二种 该方法差不多比较完美
$.extend()第一个参数是true
var obj = {a:{name:"张三",age:19}};
var obj1 = {b:{name:"李四",age:19}};
var obj2 = $.extend(true,{},obj,obj1);
obj2.a.name="胡正阳";
console.log(obj2)
console.log(obj)


第三种
JSON.parse
JSON.stringfiy
var obj1 = {b:{name:"王多",age:19,show:function(){}}};
var obj2 = JSON.parse(JSON.stringify(obj1));
obj2.b.name = "宋磊";
console.log(obj1,obj2)

function copy(obj){
var newObj = {};
for(var key in obj){
if(typeof obj[key] == "Object"){
return copy(obj[key])
}
}
}

  

浅析深拷贝与浅拷贝--【godDie】--

标签:bsp   引用   log   必须   str   数组   type   传递   rip   

原文地址:https://www.cnblogs.com/w-819/p/9746406.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!