- 浅拷贝:
拷贝对象A时,对象B将拷贝A的所有字段,如果字段是内存地址,B将拷贝地址,若字段是基元类型,B将复制其值。它的缺点是如果你改变了对象B所指向的内存地址,你同时也改变了对象A指向这个地址的字段。(改变B的基元类型A不变)
- 深拷贝:
这种方式会完全拷贝所有数据,优点是B与A不会相互依赖(A,B完全脱离关联),缺点是拷贝的速度更慢,代价更大。
浅拷贝
$.extend浅拷贝实例一,$.extend(a,b)用法
var a = {
age: 28, //基元类型
company: { //内存地址
name: '腾讯',
size: 10000
}
};
var b = {
age: 30,
company: {
name: '阿里巴巴'
},
stature: '172cm'
};
var c = $.extend(a,b); //a拷贝b的内容,返回拷贝给c
console.log('a:' + JSON.stringify(a));
console.log('b:' + JSON.stringify(b));
console.log('c:' + JSON.stringify(c));
//结果:
//a:{"age":30,"company":{"name":"阿里巴巴"},"stature":"172cm"}
//b:{"age":30,"company":{"name":"阿里巴巴"},"stature":"172cm"}
//c:{"age":30,"company":{"name":"阿里巴巴"},"stature":"172cm"}
//相当于删除a,再把b复制给a
//若var c = $.extend(a,b);后面加上下面语句:
b.age = 25; //只有b的age变成25
b.company.name = '腾讯'; //a,b,c的company.name都变成‘腾讯‘
b.age2 = 25; //只有b多了age2
b.company.name2 = '腾讯'; //a,b,c都多了company.name2
a.age = 25; //只有a,c的age变成25
a.company.name = '腾讯'; //a,b,c的company.name都变成‘腾讯‘
a.age2 = 25; //只有a,c多了age2
a.company.name2 = '腾讯'; //a,b,c都多了company.name2
//改变或增加c的参数时情况同a
$.extend浅拷贝实例二,$.extend({},a,b)用法
//上例中var c = $.extend(a,b);改为var c = $.extend({},a,b);
//结果: //a不变,拷贝b的内容返回给c
//a:{"age":28,"company":{"name":"腾讯","size":10000}}
//b:{"age":30,"company":{"name":"阿里巴巴"},"stature":"172cm"}
//c:{"age":30,"company":{"name":"阿里巴巴"},"stature":"172cm"}
//若var c = $.extend({},a,b);后面加上下面语句:
b.age = 25; //只有b的age变成25
b.company.name = '腾讯2'; //b,c的company.name都变成‘腾讯2‘
b.age2 = 25; //只有b多了age2
b.company.name2 = '腾讯2'; //b,c都多了company.name2
//改变或增加c的参数时情况同b,但b变成c
//改变或增加a的参数时b,c不受影响
深拷贝
$.extend深拷贝实例一,$.extend(true,a,b)用法
//上例中var c = $.extend(a,b);改为var c = $.extend(true,a,b);
//结果:
//a:{"age":30,"company":{"name":"阿里巴巴","size":10000},"stature":"172cm"}
//b:{"age":30,"company":{"name":"阿里巴巴"},"stature":"172cm"}
//c:{"age":30,"company":{"name":"阿里巴巴","size":10000},"stature":"172cm"}
//不同于浅拷贝,深拷贝时b不变,若a中有和b相同的参数,b会覆盖该参数的值;a有b没有的参数保留;a没有b有的参数添加到a中。并返回a给c。
//若var c = $.extend(true,a,b);后面加上下面语句:
//改变或增加a,c的任何参数c,a的参数做同样改变,b不变
//改变或增加b的参数时a,c不受影响
$.extend深拷贝实例二,$.extend(true,{},a,b)用法
//上例中var c = $.extend(a,b);改为var c = $.extend(true,{},a,b);
//结果:
//a:{"age":28,"company":{"name":"腾讯","size":10000}}
//b:{"age":30,"company":{"name":"阿里巴巴"},"stature":"172cm"}
//c:{"age":30,"company":{"name":"阿里巴巴","size":10000},"stature":"172cm"}
//a,b不变,c规则同上(若a中有和b相同的参数,b会覆盖该参数的值;a有b没有的参数保留;a没有b有的参数添加到c中)。
//若var c = $.extend(true,{},a,b);后面加上下面语句:
//改变或增加a,b,c的任何参数其余都不变
林秀栋的技术博客