js的深拷贝

深拷贝

深拷贝:拷贝后一样且不是同一个引用

  • 利用JSON格式 限制条件:要拷贝的数据内部没有引用数据,时间,正则,undefined,原型链等特殊情况时

    var re = {x1: null,x2: new Date(),x3: {name:'kale'}}
    var re_1 = JSON.parse(JSON.stringify(re))
    // 观察结果,时间的拷贝是错误的,对于一些特殊的对象,此方法不能解决
    console.log(re,re_1)
    
  • 写一个函数来进行深拷贝

    var arr = [3409,4980,['ajhg',88]]
      function deepcopy(data) {
        // null js的其他基本类型 时间 正则 
        if (data == null) { return null }
        if (typeof data !== 'object') { return data }
        if (data.constructor == Date) { return new Date(data)}
        if (data.constructor == RegExp) { return new RegExp(data)}
        // 对象
        let newObj = new data.constructor()
         // for (let key in data) {
        //   if (data.hasOwnProperty(key)) {
        //     let val = data[key]
        //     newObj[key] = typeof val == 'object' ? arguments.callee(val) : val
        //   }
        // }
    
    
        // 兼容性更好
        let re = Object.keys(data)
        for (let i = 0; i < re.length; i++) {
          let val = data[re[i]]
          newObj[re[i]] = typeof val == 'object' ? arguments.callee(val) : val
        }
    
        return newObj
      }
    
      var newarr = deepcopy(arr)
      console.log(arr)
      console.log(newarr);
      console.log(arr == newarr)
    
posted @ 2022-06-17 14:25  a立方  阅读(847)  评论(0编辑  收藏  举报