当我们要使用的对象要用到其他对象的内容,这时就需要使用对象拷贝了。
语法:$.extend([deep], target, Obj1[,ObjN])
deep:如果设 true 为深拷贝,那么 默认 false 就是浅拷贝
target:要拷贝的目标对象
Obj:代拷贝的对象
接下来给大家详细介绍一下
- 浅拷贝
1.1一个对象为空,另一个不为空
var targetObj = {};
var Obj = {
id: 1,
name: 'Ross'
}
$.extend(targetObj, Obj);
console.log(targetObj);
console.log(Obj);
拷贝结果是:两个对象内容完全一样
1.2 两个对象都非空,而且有一个属性完全相同
var targetObj = {
id: 4
};
var Obj = {
id: 1,
name: 'Ross'
}
$.extend(targetObj, Obj);
console.log(targetObj);
console.log(Obj);
拷贝结果跟第一种一样,这就说明如果属性相同,那么就会被覆盖
1.3 被拷贝对象里面有复杂数据类型
var targetObj = {
id: 4
};
var Obj = {
id: 1,
name: 'Ross',
lxc: {
sex: 'boy'
}
}
$.extend(targetObj, Obj);
console.log(targetObj);
console.log(Obj);
能把简单数据类型和复杂数据类型都拷贝了
但是对于复杂数据类型来说,是深拷贝还是浅拷贝,换句话说,是拷贝的对象 lxc 的地址,还是把 lxc 对象拷贝了
targetObj.lxc.sex = 'gril';
然后再输出一下结果是怎样呢?
可以看出:修改一个对象的值,这两个对象的值都被改变了。可以说明拷贝的是复杂数据类型 (对象lxc) 的地址。
浅拷贝把原来对象里面的复杂数据类型地址拷贝给目标对象
- 深拷贝
var targetObj = {
id: 4
};
var Obj = {
id: 1,
name: 'Ross',
lxc: {
sex: 'boy'
}
}
$.extend( true,targetObj, Obj);
console.log(targetObj);
console.log(Obj);
在这种情况下,看不出任何端倪,所以我们再修改一下
targetObj.lxc.sex = 'gril';
可以看出,修改对象 targetObj ,下面的对象内容没有改变。深拷贝也会覆盖相同元素,被拷贝的对象元素覆盖拷贝对象元素
深拷贝把里面的数据完全复制一份给目标对象 如果里面有不冲突的属性,会合并到一起