js的深浅拷贝

206 阅读1分钟

对于对象来说,浅复制是对对象地址的复制,并没有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变。

而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

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

最简单的深拷贝

不过这有局限性: 无法复制函数原型链