JS深拷贝(支持多种数据类型)

JS深拷贝


JS实现深拷贝, 支持函数、数组、undefined、Date、RegExp、Error 等对象的深拷贝方法。以下是完整代码:

function deepClone(obj, hash = new WeakSet()) {
  // 判断是否为对象
  function isObject(o) {
    return o != null && typeof o === 'object';
  }

  // 判断是否为普通对象
  function isPlainObject(o) {
    return o && typeof o === 'object' && Object.getPrototypeOf(o) === Object.getPrototypeOf({});
  }

  // 处理基本类型和特殊类型
  if (!isObject(obj)) {
    return obj;
  }

  // 处理循环引用
  if (hash.has(obj)) {
    return;
  }

  hash.add(obj);

  let cloneObj;

  // 根据不同的类型创建新的对象
  if (Array.isArray(obj)) {
    cloneObj = [];
  } else if (obj instanceof Date) {
    cloneObj = new Date(obj);
  } else if (obj instanceof RegExp) {
    cloneObj = new RegExp(obj);
  } else if (obj instanceof Error) {
    cloneObj = new obj.constructor(obj.message);
  } else if (isPlainObject(obj)) {
    cloneObj = {};
  } else {
    // 对于其他构造函数创建的对象,使用构造函数创建新实例
    cloneObj = new obj.constructor();
  }

  // 遍历对象属性
  Object.keys(obj).forEach(key => {
    cloneObj[key] = deepClone(obj[key], hash);
  });

  return cloneObj;
}

// 示例
const originalObj = {
  a: 1,
  b: [1, 2, 3],
  c: {
    d: new Date(),
    e:  /[a-z]/,
    f: [1,2,3],
    g: function() { console.log('hello'); },
    h: undefined,

    i: [new Date(),  /[a-z]/, [1,2,3]]
  }
};

const clonedObj = deepClone(originalObj);

console.log(clonedObj);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值