浅拷贝
我们知道浅拷贝时,如果是拷贝基本类型的变量时没问题,当拷贝非基本类型的变量时,实际上拷贝的是原对象的地址,他们指向的对象是堆中的同一个对象
var a = {
key1:"111"//这是基本类型的变量
}
function Copy(ele){
var c = {};
for(var i in ele){
c[i] = p[i];
}
return c;
}
a.key2 = ['22','222'];
var b = Copy(a);
b.key3 = "333";
//基本类型 b.key1能访问的到 并 且改变后a.key1不会变化
//b.key2也能访问的到公共的 b.key2改变后 a.key2变化
//a.key3 没有被共享
深拷贝
深拷贝即是完全拷贝一个对象,拷贝获得的对象中的非基本类型的变量拥有完全属于与自己的对象,而不是和被拷贝的对象拥有的同一个对象,也就是说当改变拷贝得到的对象的变量的属性时,不会影响被拷贝的对象的变量的属性。
//简单实现
var arr1 ={
key1:[1,2,'a3',[1,2,3]],
key2:"a is",
key3:{
ak:"some akey3"
},
key4:function(){
alert("function for key4 !");
}
}
var tempArr ={};
newArr = deepCopy(tempArr,arr1);
function deepCopy(tArr,arr){
for(var i in arr){
if(typeof arr[i] === 'object'){ //能够‘深拷贝’ 对象 数组(二维也行) 以及函数
tArr[i] = (arr[i] instanceof Array)?[]:{};
deepCopy(tArr[i],arr[i]);
}else{
tArr[i]=arr[i];
}
}
return tArr;
}
console.log(arr1);
console.log(newArr);