为什么会出现深拷贝和浅拷贝:
首先谈一谈,js的数据类型,基本类型有:Number,String,null,undefined,boolean;引用类型有:Array,Object,Function;当基本类型赋值时,是直接增加了内存空间,相互独立了;但是当引用类型赋值或则复制时直接改变了指针方向,好比两个人有了同一间房子的钥匙,都指向了同一内存,所以是相互影响的。
举个简单的例子:1:,b是没有变的。2:,当变成引用类型时,a改变时b也随着改变了。这个赋值可以简单的理解为浅拷贝哈(我自己认为的),但是也可以使用深拷贝的方法使两个变量相互独立,互不影响。
深拷贝方案:
1,使用JSON.parse(JSON.stringify())的方式。但是这个会有缺陷:
- 不能复制function、正则、Symbol
- 循环引用报错
- 相同的引用会被重复复制
2,使用递归的方式实现深拷贝:
function deepCopy(source, target) { for(var key in source){ var item = source[key]; if(item instanceof Object){ target[key] = {}; //新增一个空的对象来接受 deepCopy(item,target[key]); //递归调用方法 }else if(item instanceof Array){ target[key]=[]; deepCopy(item,target[key]);//递归调用方法 }else { target[key] = source[key];//递归调用方法 } } } var obj1 = { name : '黄影影', age : 18, baba:{ name: 'lkk' } };
var obj2 = {};
deepCopy(obj1,obj2)
到这里可以实现深拷贝了。