浅拷贝
浅拷贝是对对象的每个属性进行复制,不会递归复制,当我们复制的属性值为对象的时候,实际上只是复制了一个内存地址(因为对象是存储在堆内存中)
var objTem = { a:{w:2},b:2,c:3 };
//objTem 是一个对象,b、c属性值都是基本数据类型存储在栈内存中,a属性值({w:2})是对象存储在堆内存中 ,{w:2}里面的w属性值2存储在栈内存中。
function copy(obj){
var c = obj instanceof Array ? [] : {} //判断参数是数组还是对象
for(var key in obj){
if(obj.hasOwnProperty(key)){ c[key] = obj[key] }
}
return c;
}
var objC = copy(objTem)
objC.c=22;
console.log(objTem.c) //3 不受objC改动影响
//objC对象属性b、c是重新在栈内存划分了一块地址,所以改动objC对象中的c不会影响objTem上的c属性值
objC.a.w = 10;
console.log(objTem.a.w) //10 objTem对象属性a的w也变化了
//objC对象a属性值是复制了一个指针,指向objTem对象a属性值({w:2})的内存地址,所以objC.a.w=10实际上是修改了a属性值的w属性值2为10
深拷贝 递归复制对象上的每一个属性,并在内存中开辟新的内存地址
var objTem = { a:{w:2},b:2,c:3 };
function deepCopy(obj) {
var c = obj instanceof Array ? [] : {}
if (typeof obj !== 'object' && obj != null) {
return obj;
} else {
for (var key in obj) {
c[key] = typeof obj[key] === 'object' && obj[key] != null ? deepCopy(obj[key]) : obj[key]
}
}
return c;
}
var objC = deepCopy(objTem)
objC.a.w = 10;
console.log(objTem.a.w) //2 objTem对象属性a的w没有变化