浅拷贝:引用数据类型的拷贝是拷贝的内存地址
var person = {
name:"lisi",
age: 12,
}
}
person 在栈里面存的是一个内存地址(指向堆里面的对象数据)
var p2 = person; // person相当于把内存地址赋值给了p2,这是p2和person就指向了堆内存的同一个对象数据。
var p2 = person // 引用数据类型的拷贝都是拷贝的内存地址(浅拷贝)
// console.log(p2 === person); // 对象的比较是比较内存地址,地址相同返回true,不相同返回false。
p2.name = "lisi"; // // p2是一个内存地址,改变的是p2的内存地址指向的对象的name
console.log(person.name); // person和p2是通一个内存地址,所以person使用的对象就是p2改过的对象。
深拷贝,就不是拷贝内存地址,而是直接拷贝数据。
var p3 = {}; // 创建一个空对象,把persion的所有属性拷贝到空对象里面。
for(var o in person){
p3[o] = person[o];
}
console.log(p3);
递归实现多层深拷贝:
var p1 = {
name: "zhang san",
age: 22,
family:{
address: "guangzhou bai yun qu",
number: 12,
phone: 1333333333
}
}
function deepCopy(newObj,obj){
for(var o in obj){
if(obj[o] instanceof Object){
newObj[o] = {};
deepCopy(newObj[o],obj[o]);
}
else if(obj[o] instanceof Array){
newObj[o] = [];
deepCopy(newObj[o],obj[o]);
}
else{
newObj[o] = obj[o];
}
}
}
var p2 = {}
deepCopy(p2,p1)
p1.family.address = "襄阳"
console.log(p2,p1)