手动实现深拷贝
在JavaScript中,
简单类型会存储到栈中,简单类型的值会直接存在栈中
复杂类型(引用类型)会存储到堆中,复杂类型在栈中存储了一个地址,这个地址指向它的实际内容(在堆中)
浅拷贝
所以拷贝默认是复制栈中的内容(默认为浅拷贝),
对于简单类型来说,就是复制了它本身
对于复杂类型来说,只是复制了它内容的存储地址,
如果另一个复杂类型对这个复杂类型进行了浅拷贝,那么他们在栈中存储的指针指向同一个地址,如果其中一个复杂类型发生了变化,则另一个也会跟着变化
深拷贝
深拷贝是在堆中开辟一个新的位置,用来存放复制的复杂类型的值。那么两个复杂类型的栈中存储的地址就不一样了,改动其中一个不会再影响另一个
//默认参数为 obj={}
function deepClone(obj = {}) {
    //如果obj是null 或者不是对象和数组,则直接返回
    if (typeof obj !== 'object' || obj == null) {
        return obj;
    }
    //初始化返回结果
    let result;
    //判断是数组还是对象
    if (obj instanceof Array) {
        result = [];
    } else {
        result = {};
    }
    for (let key in obj) {
        //保证key不是原型对象里面带的属性
        if (obj.hasOwnProperty(key)) {
            //递归
            result[key] = deepClone(obj[key]);
        }
    }
    return result;
}
let obj1 = {
    age: 20,
    name: 'lizheng',
    hobbies: {
        playGame: "playGame",
        study: "study",
        sleep: "sleep"
    }
}
let obj2 = deepClone(obj1);
obj2.name = 'lz';
console.log(obj1.name);//lizheng
console.log(obj2.name);//lz
let obj3 = deepClone();
console.log(obj3);// {} 空对象
- 本文链接:http://horry233.github.io/2020/09/15/%E6%89%8B%E5%86%99%E6%B7%B1%E6%8B%B7%E8%B4%9D/
 - 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。
 
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub Issues