手动实现深拷贝
一、浅拷贝和深拷贝的定义
-  浅拷贝: 创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。 
-  深拷贝: 将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象 
二、实现深拷贝
乞丐版
JSON.parse(JSON.stringify());
- 缺陷: 这种写法非常简单,而且可以应对大部分的应用场景,但是它还是有很大缺陷的,比如拷贝其他引用类型、拷贝函数、循环引用等情况。
基础版本
function clone(target) {
    if (typeof target === 'object') {
        let cloneTarget = {};
        for (const key in target) {
            cloneTarget[key] = clone(target[key]);
        }
        return cloneTarget;
    } else {
        return target;
    }
};
// 测试
const target = {
    field1: 1,
    field2: undefined,
    field3: 'ConardLi',
    field4: {
        child: 'child',
        child2: {
            child2: 'child2'
        }
    }
};
缺陷: 没有考虑数组
考虑数组
function clone(target) {
    if(typeof target === 'object') {
        let cloneTarget =  Array.isArray(target)? [] : {}
        for(const k in target) {
            cloneTarget[k] = clone(target[k])
        } 
        return cloneTarget;
    } else {
        return target;
    }
}
// 测试
const target = {
field1: 1,
field2: undefined,
field3: 'ConardLi',
field4: {
    child: 'child',
    child2: {
        child2: [1,2,3,4]
    }
}
};
const res = clone(target);
console.log(res);
深拷贝到此已经很不错了,但还要考虑其他情况未完待续……
学习参考:
非常非常感谢:如何写出一个惊艳面试官的深拷贝