拷贝对象语法:
$.extend( [deep], target, object1, [objectN] )
deep
如果写true就为深拷贝,false或者不写都为浅拷贝target
为拷贝的目的地object1
为拷贝的源头
- 浅拷贝(默认):对象只复制地址,不开辟新的地址空间,修改拷贝之后
target
的对象里的内容会把原来的object1
那边也改掉。如果target
里面本来就有一个同名的对象,会直接覆盖里面的原有数据- 深拷贝:是开辟新的地址空间给对象,对
target
的对象的操作不会影响到原来object1
那边。如果target
里面本来就有一个同名的对象,会直接保留原有的不冲突的数据
浅拷贝 | 深拷贝 | ||
简单数据类型 | 变量名相同的情况 | 覆盖 | 覆盖 |
变量名不同的情况 | 保留 | 保留 | |
对象 | 对象变量名相同的情况 | 覆盖 | 保留对象里面key不同的内容 |
对象变量名不同的情况 | 保留 | 保留 |
<script>
var targetObj = {
id: 1,
age: 80,
msg: {
xixi: 8,
sex: 1,
heihei: 1,
},
};
var obj = {
id: 10000,
msg: {
haha: 8,
sex: 1000,
name: "zz",
},
};
// (默认)浅拷贝:简单数据类型同名的覆盖,不同名的保留,复杂数据类型复制地址,同名的原来的覆盖
/*
$.extend(targetObj, obj);
console.log("old");
console.log(obj);
console.log("new");
console.log(targetObj);
// 浅拷贝情况下 targetObj 的msg: {haha: 8, sex: 1000, name: 'zz'}
// 因为msg名字相同,所以直接把地址拷贝过去了,原来的就没了
*/
// 深拷贝
$.extend(true, targetObj, obj);
console.log("old");
console.log(obj);
console.log("new");
console.log(targetObj);
// 深拷贝情况下msg: {xixi: 8, sex: 1000, heihei: 1, haha: 8, name: 'zz'}
// 只有sex因为同名被覆盖了,其他都保留了
</script>