手动实现深拷贝

在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);// {} 空对象