深拷贝与浅拷贝
浅拷贝:拷贝引用地址 (只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存)
由于引用类型(object,array,function)的数据在栈里储存的只是堆地址,所以当对引用类型进行直接赋值时,实际上只复制了地址,复制出来的变量和原来的变量最终都指向同一个对象。当改变其中一个对象的属性值时,两个对象都会发生改变
深拷贝:拷贝实例 (复制并创建一个一摸一样的对象,不共享内存,修改新对象,旧对象保持不变。)
当修改赋值的对象 会影响原对象;修改原对象也会影响赋值的对象
如果希望深拷贝,想到了使用for in的方式,但for in有自身的问题
当for in 的键对应的值又是引用类型时,又会变为赋址操作;
解决:用递归
原型上的共享属性也会遍历
解决:使用hasOwnProperty来进行判断
如何进行深拷贝
- 原生js
- JSON.parse(JSON.stringify(obj))
- jq的$.extend方法:将一个或多个对象合并到目标对象
1 | var obj = { |
1 | //方法二:(不能复制函数) |
1 | //方法三:jq的深浅拷贝 |