cloneDeep方案

问题:项目只用到lodash的cloneDeep,但其打包体积足有400k。方案:自己实现cloneDeep。

utils/index.js

export function cloneDeep(obj, hash = new WeakMap()) {
  // 基础类型和 null 直接返回
  if (obj === null || typeof obj !== 'object') return obj;

  // 查找缓存,防止循环引用导致无限递归
  const cachedClone = hash.get(obj);
  if (cachedClone) return cachedClone;

  let clone;
  // 处理 Array, Set, Map, Date, RegExp 等特殊类型
  switch (obj.constructor) {
    case Array:
      clone = [];
      break;
    case Object:
      clone = {};
      break;
    case Set:
      clone = new Set();
      break;
    case Map:
      clone = new Map(Array.from(obj));
      break;
    case Date:
      clone = new Date(obj);
      break;
    case RegExp:
      clone = new RegExp(obj.source, obj.flags);
      break;
    default:
      console.warn(
        `deepClone: Unsupported type encountered (${obj.constructor.name}).`
      );
      return undefined;
  }

  // 将复制的对象放入缓存
  hash.set(obj, clone);

  // 遍历并复制对象属性
  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      clone[key] = cloneDeep(obj[key], hash);
    }
  }

  // 特殊处理 Set 和 Map 的值
  if (obj instanceof Set) {
    for (const value of obj) {
      clone.add(cloneDeep(value, hash));
    }
  } else if (obj instanceof Map) {
    for (const [key, value] of obj.entries()) {
      clone.set(key, cloneDeep(value, hash));
    }
  }

  return clone;
}

test:

var a = {
  a: 1,
  b: '11',
  c: false,
  d: [1, 'a'],
  e: { a: 1, b: { c: 2 } },
  f: new Date(),
  g: new Set([1, 'a']),
  h: new Map([[1, 'a']]),
  j: { say: () => 'hello' },
  k: a
};
var b = cloneDeep(a);
a.d.push(1);
console.log(a);
console.log(b);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Clonedeep是一种在计算机编程中广泛使用的方法或技术,用于创建一个对象的完全副本。这个术语通常在面向对象的编程语言中使用,例如Java。 Clonedeep是从一个现有的对象中创建一个新的对象,并确保这个新对象与原始对象完全相同。换句话说,clonedeep创建了一个具有相同属性和值的独立副本,而不是简单地引用或指向原始对象。 Clonedeep的实现可以通过不同的方式,具体取决于编程语言和应用要求。在Java中,通常需要实现Clonable接口,并覆盖clone()方法,以确保对象被正确地复制。在其他编程语言中,可能需要使用各种库或框架来实现类似的效果。 使用clonedeep可以带来许多好处。首先,它允许在不影响原始对象的情况下对对象进行修改和操作。这对于需要创建一些基于现有对象的新对象的场景非常有用。其次,clonedeep可以提高性能,因为复制一个已有的对象比创建一个全新的对象更有效率。 然而,使用clonedeep也存在一些潜在的问题。例如,如果对象包含了对其他对象的引用,clonedeep只会复制引用而不是实际对象。这可能导致对象之间有意想不到的依赖关系,从而导致错误或意外的行为。解决这个问题的常见方法是使用深度复制,即不仅复制引用,还复制引用指向的对象本身。 总的来说,clonedeep是一种非常有用的编程技术,可以帮助开发人员在处理和操作对象时更加灵活和高效。但在使用时需要注意潜在的问题,并根据具体情况采取适当的解决方案

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值