浅拷贝和深拷贝在类的地方有提到过,浅拷贝即拷贝表面的对象,里面的对象都是拷贝地址。而深拷贝把整个对象都拷贝。
1-对象
var a={
id:1,
name:'zhangsan',
gongneng:{
sing:function(){},
chifan:function(){}
}
}
【分析】引擎首先开辟了一个空间,然后储存id,name,gongneng,因为gongneng的值是个对象,引擎开辟了一个新空间,储存这个对象,而原本gongneng的空间储存的就是指向这个空间的地址。
可以通过图片理解。
1.2_浅拷贝
1.2.1_原始的浅拷贝
原始的浅拷贝(a拷贝给b)是通过遍历a的属性然后给b,即:
var a={
id:1,
name:'zhangsan'
gongneng:{
sing:function(){
console.log('你正在唱歌');
}
}
};
var b={};
for(k in a){
b[k]=a[k];
}
然后a拷贝给b的gongneng属性的值是另一个空间的地址,所以a和b共用一个地址,显然没有达到深拷贝的目的。
1.2.2_Es6提供的浅拷贝方法
如果觉得写原始的方法比较麻烦,可以使用Es6提供的办法。Object.assign(o,obj);即把obj拷贝给o。
1-3_深拷贝
深拷贝即每一层数据都拷贝。
原始做法-递归遍历:
var a={
id:1,
name:{name1:'zhangsan',name2:'lisi'},
sex:[{sex:'nan'},'nv']
}
var b={}
function shenkaobei(b,a){
for(k in a){
if(a[k] instansof Object){b[k]={}; shenkaobei(b[k],a[k])}
else if(a[k] instansof Array){b[k]=[];shenkaobei(b[k],a[k])}
else{b[k]=a[k]}
}
};
shenkaobei(b,a);
逻辑代码如上,可以尝试分析分析,很有趣。