简单深拷贝的俩种方法

214 阅读1分钟

方法1.使用JSON

缺点:

 1.如果obj里有functionundefined,序列化的时候会丢失
 2.如果obj里有循环引用,则不能进行深拷贝
    let obj = {
        age:20,
        hobby:['游戏','上课','干饭'],
        name:'李四',
        student:{name:'1111',age:38}
    }
    // 方法1.使用JSON
        // 1.1把obj转成JSON格式字符串:底层会自动深拷贝
        let jsonStr = JSON.stringify(target)
        // 1.2把JSON转成对象
        let newObj = JSON.parse(jsonStr)
        console.log(newObj)        

方法2:递归

缺点:只做了值类型和数组/对象的处理,如果有例如date,function其他类型都拷贝不出来

function cloneDeep(obj,newObj){
        for (let key in obj) {
            //   判断是不是数组
            if(obj[key] instanceof Array){
                newObj[key] = []
                //   递归调用 继续深拷贝
                cloneDeep(obj[key],newObj[key])
            // 判断是不是对象
            }else if(obj[key] instanceof Object){
                newObj[key] = {}
                //   递归调用 继续深拷贝
                cloneDeep(obj[key],newObj[key])
            }else{
                newObj[key] = obj[key]
            }
          }
        }
    //   声明一个空对象
      let newObj = {}
    //   调用方法
      cloneDeep(obj,newObj)
    //  控制台打印输出
      console.log(newObj)