对于对象来说,浅复制是对对象地址的复制,并没有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变。
而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。
var xiaoming = {
name:'ming',
age:'27',
lover:['lili','xiaoya']
}
var laowang = xiaoming;
laowang.age //27
xiaoming.age = '28';
laowang.age //28
浅拷贝:
let shadowCopy = (obj) =>{
if(typrof obj !== 'object' || obj === null) return;
let result = obj instanceof Array ? [] : {};
for(let key in obj){
result[key] = obj[key]
}
return result;
}
深拷贝的两种方式
1.迭代复制
let deepCopy = (obj) =>{
if(typeof obj !== 'object' || obj === null) return;
let result = obj instanceof Array ? [] : {};
for(let key in obj){
if(obj.hasOwnProperty(key)){
console.log(obj[key]);
if(typeof obj[key] === 'object' && obj[key] !== null){
result[key] = deepCopy(obj[key]);
}else{
result[key] = obj[key];
}
}
}
return result;
}
2.JSON解析解决
var xiaoming = {
name:'ming',
age:'27',
lover:['lili','xiaoya'],
getAge:function(){
console.log(this.age);
}
}
var laowang = JSON.parse(JSON.stringify(xiaoming));
laowang.age;//27
laowang.getAge();//Uncaught TypeError: laowang.getAge is not a function
最简单的深拷贝
不过这有局限性: 无法复制函数原型链