深拷贝和浅拷贝
Posted carolavie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深拷贝和浅拷贝相关的知识,希望对你有一定的参考价值。
/*
1、值传递
2、引用传递
*/
var a = 10;
var b = a;
b++;
//console.log(a,b)//a:10 b:11
var arr = [10,20,30,40];
var arr1 = arr;
arr1[0] = 40;
//console.log(arr,arr1);//[40,20,30,40] [40,20,30,40]
/*
浅拷贝:
当一个对象拷贝另一个对象的数据的时候,只要一个对象的数据发生改变另一个对象的数据也会发生改变
因为浅拷贝拷贝的是引用的地址
//ES6 Object.assign()
参数1:target
参数2:对象......
参数3:对象....
。。。。。。。。。
$.extend()
除了可以给jquery对象扩展方法外还可以实现深浅拷贝
1、布尔值 如果填true的情况下是深考贝 什么也不写就是浅拷贝
2、目标对象
3......后面所有的对象 都是需要合并的对象
//第一种方式 要求对象必须是多层的状态下才能实现浅拷贝
var obj = {a:{name:"宋磊",age:19}};
var obj1 = Object.assign({},obj);
obj1.a.name="王多"
console.log(obj1)
console.log(obj)
//第二种方式 要求对象必须是多层的状态下才能实现浅拷贝
var obj = {a:{name:"宋磊",age:19}};
var obj2 = {a:1,b:2,c:3};
function copy(obj){
var newObj = {};
for(var key in obj){
newObj[key] = obj[key];
}
return newObj;
}
var obj1 = copy(obj);
obj1.a.name="王多"
console.log(obj1)
console.log(obj)
第三种方式
var obj = {a:{name:"宋磊",age:19}};
var obj1 = {b:{name:"王多",age:19}};
var obj2 = $.extend({},obj,obj1)
obj2.a.name="胡正阳";
console.log(obj2)
console.log(obj)
*/
/*
深拷贝
当一个对象拷贝另一个对象的数据的时候,其中一个对象的数据发生变化不会影响另一个对象的数据
因为深考贝拷贝的是对象的数据而不是地址
第一种方式 对象是单层的情况下
//Object.assign()
var obj = {a:1,b:2,c:3}
var obj1 = Object.assign({},obj);
obj1.a = 30;
console.log(obj1,obj)
第二种 差不多比较完美
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])
}
}
}
*/
以上是关于深拷贝和浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章