js 深拷贝

这篇博客探讨了JavaScript中的深拷贝实现,通过一个名为`deepClone`的函数展示了如何处理对象和数组的递归复制,同时处理了循环引用、内置对象如正则和日期,以及null和undefined的情况。示例中给出了一个复杂对象`obj1`的深拷贝过程,并展示了拷贝前后对象的独立性。
摘要由CSDN通过智能技术生成
// 不考虑 对象中包含内置对象,循环引用  
// function deepClone (origin) {

//   if (typeof origin !== 'object' || origin === null) {
//     throw Error('origin not a object')
//   }

//   const target = Object.prototype.toString.call(origin) === '[object Object]' ? {} : []

//   for (let prop in origin) {
//     if (origin.hasOwnProperty(prop)) {
//       if (typeof origin[prop] === 'object' && origin[prop] !== null) {
//         target[prop] = deepClone(origin[prop])
//       } else {
//         target[prop] = origin[prop]
//       }
//     }
//   }
//   return target
// }

var isObject = (target) => (typeof target === 'object') && target !== null

function deepClone(target, map = new WeakMap()) {
  if (map.get(target)) {
      return target;
  }
  // 获取当前值的构造函数:获取它的类型
  let constructor = target.constructor;
  // 检测当前对象target是否与正则、日期格式对象匹配
  if (/^(RegExp|Date)$/ig.test(constructor.name)) {
      // 创建一个新的特殊对象(正则类/日期类)的实例 var set = new S
      return new constructor(target);  
  }
  const cloneTarget = Array.isArray(target) ? [] : {};
  if (isObject(target)) {
      map.set(target, true);  // 为循环引用的对象做标记
      for (let prop in target) {
          if (target.hasOwnProperty(prop)) {
            if (isObject(target[prop])) {
              cloneTarget[prop] = deepClone(target[prop], map);
            } else {
              cloneTarget[prop] = target[prop]
            }
          }
      }
  }

  return cloneTarget
}



  // var str = {};
  // var obj = { a: {a: "hello", b: 21} };
  // deepClone(obj, str);
  // console.log(str.a);


var obj1 = {
  a: 1,
  b: {
    b1: 2
  },
  c: function() {
    console.log('abc')
  },
  d: /\s/g,
  f: undefined,
  g: null,
  date: new Date(),
}
// obj1.e = obj1
// Object.prototype.hasOwnProperty
// o
// var obj2 = JSON.parse(JSON.stringify(obj1))

// var obj2 = deepClone(obj1)
var obj2 = deepClone(obj1)


// obj1.b.b1 = 5
console.log(obj1)
console.log(obj2)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值