js对象的深拷贝

1.JSON.stringfy()和JSON.parse()

但是这种方法有其局限性,当值为undefinedfunctionsymbol 会在转换过程中被忽略

var copy = JSON.parse(JSON.stringify(obj))

  

2. 递归函数

function deepCopy(obj) {
      var result = Array.isArray(obj) ? [] : {};
      for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
          if (typeof obj[key] === 'object' && obj[key]!==null) {
            result[key] = deepCopy(obj[key]);   //递归复制
          } else {
            result[key] = obj[key];
          }
        }
      }
      return result;
    }

 

 1 function deepClone (obj) {
 2     if (obj === null) return null
 3     if (typeof obj !== 'object') return obj;
 4     if (obj.constructor === Date) return new Date(obj);
 5     var newObj = new obj.constructor();  //保持继承链
 6     for (var key in obj) {
 7         if (obj.hasOwnProperty(key)) {   //不遍历其原型链上的属性
 8             var val = obj[key];
 9             newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合
10         }
11     }
12     return newObj;
13 }

 

posted @ 2021-06-08 23:33  至简至真  阅读(39)  评论(0编辑  收藏  举报