You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化JavaScript深克隆:提升性能与兼容多数据结构的方法咨询

深克隆函数的性能问题与优化方案

先看你当前代码存在的几个核心问题,这些直接导致了性能低下和功能缺失:

  • 拼写错误:array.isArray应为Array.isArray,会直接引发运行错误
  • 数组处理逻辑冗余且低效:循环数组时每次都执行clone[k]=arr,完全没必要,应该放在循环结束后
  • 未处理null:typeof null === 'object',会被误判为对象递归,导致错误
  • 使用for...in遍历:会遍历原型链上的属性,额外增加不必要的遍历开销
  • 无返回值:函数最后没返回克隆结果,调用后得到undefined
  • 不支持循环引用:遇到对象自引用会无限递归栈溢出
  • 仅支持对象和数组,不处理Date、RegExp、Map、Set等特殊类型

优化后的深克隆实现

function deepClone(obj, cache = new WeakMap()) {
  // 处理基本类型、函数、Symbol
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }

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

  // 处理特殊对象类型
  let clone;
  if (obj instanceof Date) {
    clone = new Date(obj.getTime());
  } else if (obj instanceof RegExp) {
    clone = new RegExp(obj.source, obj.flags);
  } else if (obj instanceof Map) {
    clone = new Map();
    obj.forEach((val, key) => {
      clone.set(deepClone(key, cache), deepClone(val, cache));
    });
  } else if (obj instanceof Set) {
    clone = new Set();
    obj.forEach(val => {
      clone.add(deepClone(val, cache));
    });
  } else if (Array.isArray(obj)) {
    clone = obj.map(item => deepClone(item, cache));
  } else {
    // 普通对象,只遍历自身可枚举属性
    clone = Object.create(Object.getPrototypeOf(obj));
    Object.keys(obj).forEach(key => {
      clone[key] = deepClone(obj[key], cache);
    });
  }

  // 缓存已克隆的对象,处理循环引用
  cache.set(obj, clone);
  return clone;
}

具体优化点说明

  • 修复基础错误:修正Array.isArray的拼写错误,添加函数返回值
  • 性能优化:
    • 用Object.keys代替for...in,只遍历对象自身可枚举属性,避免原型链遍历的额外开销
    • 数组处理用map方法替代手动循环,代码更简洁且性能更优
    • 彻底移除数组循环内的冗余赋值操作
  • 处理边界情况:
    • 直接返回基本类型、函数和Symbol(函数通常不需要深克隆,若需要可自行调整)
    • 单独处理null,避免误判为对象递归
  • 支持更多数据结构:新增Date、RegExp、Map、Set的处理逻辑,可根据需求扩展其他类型(如TypedArray等)
  • 解决循环引用:用WeakMap缓存已克隆的对象,避免无限递归,同时WeakMap不会阻止垃圾回收,更内存友好
  • 保留原型链:普通对象克隆时用Object.create(Object.getPrototypeOf(obj)),保留原对象的原型继承关系,原函数会丢失原型链

内容的提问来源于stack exchange,提问作者JDXN.xyz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:17:06