1. // 1.有缺点的深拷贝:obj内的方法无法拷贝,原本的构造函数会丢失
    2. const newobj = JSON.parse(JSON.stringify(oldobj))
    3. // 2.浅拷贝:第一层完全拷贝,下面层数的对象都是拷贝了一个指针
    4. const newobj = Object.assign({}, oldobj)
    5. // 3.递归深度克隆:完全深拷贝
    6. const deepClone = oldobj => {
    7. if(oldobj === null) return null
    8. // 基本值和函数 直接返回
    9. if(typeof oldobj !== 'object') return oldobj
    10. // 正则和日期无法遍历,且属于对象,所以直接处理返回
    11. if(oldobj instanceof RegExp) {
    12. return new RegExp(oldobj);
    13. }
    14. if(oldobj instanceof Date) {
    15. return new Date(oldobj)
    16. }
    17. // 继承自同一个构造函数
    18. let newObj = new oldobj.constructor
    19. for(let key in oldobj) { // for in 可以遍历对象所有可迭代属性
    20. if(oldobj.hasOwnProperty(key)) {
    21. // hasOwnProperty方法用来判断对象自身属性中是否拥有某属性
    22. newObj[key] = deepClone(oldobj[key]);
    23. }
    24. }
    25. return newObj
    26. }