借jQuery对象拷贝学习深拷贝与浅拷贝
jQuery.extend([deep], target, object1, [objectN]) 即用一个或多个其他对象来扩展一个对象,返回被扩展的对象。
deep:如果设为true,则递归合并。
target:待修改对象。
object1:待合并到第一个对象的对象。
objectN:待合并到第一个对象的对象。
其中[deep]可选,深/浅拷贝,true:深拷贝 false:浅拷贝(默认)
浅拷贝与深拷贝区别:
var targetObj = { id: 0, msg: { sex: '男' } } var obj = { id: 1, name: 'andy', msg: { age: 18 } }
在上面targetObj与obj两个对象中,存在id,name两个简单数据类型和msg这个复杂数据类型。
1.浅拷贝 把原来对象里面的复杂数据类型地址拷贝给目标对象
在进行浅拷贝时,对于简单数据类型的如果不存在相同的属性名则将属性名与属性值进行精确拷贝,若已存在属性名则会将属性值进行拷贝(覆盖)给待修改对象。
对于复杂数据类型,会将其地址拷贝给目标对象
比如,浅拷贝后如果对目标对象的复杂数据类型进行修改,则就是对该内存地址进行修改,把变量在栈空间保存的堆地址复制给了形参,则目标对象与被拷贝对象都会进行修改
$.extend(true, targetObj, obj) targetObj.msg.age = 20; console.log(targetObj); console.log(obj);
浅拷贝后,并对复杂数据类型进行修改:
2.深拷贝 把里面的数据完全复制一份给目标对象 , 如果里面有不冲突的属性,会合并到一起
$.extend(true, targetObj, obj) //会覆盖targetObj里面原来的数据 targetObj.msg.age = 20; console.log(targetObj); console.log(obj);
深拷贝后,并对复杂数据类型进行修改:
![](https://img2020.cnblogs.com/blog/1948650/202107/1948650-20210728001807248-1304454785.png)
![](https://img2020.cnblogs.com/blog/1948650/202107/1948650-20210728001820417-474720694.png)
自己理解的一个总结,不足之处欢迎指出,感谢