首页 > 其他分享 >请写一个性能最好的深度克隆对象的方法

请写一个性能最好的深度克隆对象的方法

时间:2024-12-04 09:46:59浏览次数:5  
标签:obj 克隆 structuredClone 对象 性能 JSON 深度

在前端开发中,深度克隆对象没有绝对“性能最好”的单一方法,因为最佳方法取决于被克隆对象的具体结构和复杂性。 浅拷贝对于简单的对象很快,但对于嵌套对象会失败。深拷贝处理嵌套对象,但对于非常大的对象可能会变慢。

以下是一些常用的方法,并分析它们的性能特点,以便您可以根据实际情况选择:

1. JSON.parse(JSON.stringify(obj))

  • 优点: 简单易用,适用于大多数常见情况,对包含日期或函数的对象无效。
  • 缺点: 无法处理循环引用,会丢失原型链,不支持自定义类和函数。对于大型复杂对象,性能较差。

2. Lodash 的 _.cloneDeep(obj)

  • 优点: 功能强大,可以处理循环引用、自定义类和函数等复杂情况。
  • 缺点: 需要引入 Lodash 库,会增加项目体积。对于非常简单的对象,性能略逊于 JSON.parse(JSON.stringify)

3. 手动递归拷贝

  • 优点: 可以根据对象的具体结构进行优化,避免不必要的拷贝,理论上可以达到最佳性能。
  • 缺点: 实现较为复杂,需要考虑各种边界情况,维护成本较高。
function deepClone(obj) {
  if (typeof obj !== "object" || obj === null) {
    return obj;
  }

  const clonedObj = Array.isArray(obj) ? [] : {};

  for (const key in obj) {
    if (Object.hasOwn(obj, key)) { // 确保只复制对象自身的属性
      clonedObj[key] = deepClone(obj[key]);
    }
  }

  return clonedObj;
}

4. 结构化克隆算法 structuredClone()

  • 优点: 浏览器原生 API,性能优秀,支持循环引用、内置类型、自定义类等,并且通常比其他方法更快。
  • 缺点: 兼容性问题,较老的浏览器可能不支持 (IE 不支持)。
const clonedObj = structuredClone(obj);

性能比较和选择建议:

  • 对于简单对象,JSON.parse(JSON.stringify) 通常最快,但要注意其局限性。
  • 对于复杂对象,特别是包含循环引用、自定义类或函数等,_.cloneDeepstructuredClone 是更好的选择。
  • structuredClone 通常比 _.cloneDeep 更快,并且是原生 API,因此如果浏览器兼容性允许,它是首选。
  • 对于性能要求极高的场景,可以考虑手动递归拷贝,针对对象的具体结构进行优化. 如果对象结构已知且相对简单,手动编写克隆函数可能会比通用库更快。

总结:

没有绝对最好的方法,需要根据具体场景选择。建议优先考虑 structuredClone,如果浏览器兼容性不允许,则使用 _.cloneDeep。 对于非常简单的对象,可以使用 JSON.parse(JSON.stringify),但要小心其局限性。 如果性能至关重要且对象结构已知,可以考虑手动递归拷贝。 在选择之前,最好对不同方法进行性能测试,以确定哪种方法最适合您的特定需求。

标签:obj,克隆,structuredClone,对象,性能,JSON,深度
From: https://www.cnblogs.com/ai888/p/18585583

相关文章

  • 聊一聊什么是持续性能测试
    ​目录问题的背后其实是测试团队一直需要解决的核心点,即如何测得快、测得全、测得准。建设持续测试,可以为企业带来如下价值。一、更好的用户体验二、更小的修改成本三、更稳定的系统四、挽救目标五、实施步骤六、优势近几年,DevOps的概念越来越火,各企业也逐渐意识到D......
  • 计算机毕业设计SpringCloud+大模型微服务高考志愿填报推荐系统 高考大数据 SparkML机
    温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO......
  • 基于MIMO系统的PE-AltMin混合预编码算法matlab性能仿真
    1.算法仿真效果matlab2022a仿真结果如下(完整代码运行后无水印):  仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要       在现代无线通信系统中,多输入多输出(Multiple-InputMultiple-Output,MIMO)技术是提高频谱效率和数据传输速率的关键。然而......
  • 大数据新视界 -- 大数据大厂之 Hive MapReduce 性能调优实战(下)(24 / 30)
           ......
  • iOS应用性能监控与分析技术深度解析
    在移动应用开发领域,性能优化是确保应用流畅运行和用户满意度的重要因素。iOS应用性能监控与分析技术能够帮助开发者及时发现和解决性能瓶颈,提升应用的整体质量。本文将聚焦于iOS应用性能监控与分析的几个关键方面,包括Crash监控、响应时间分析、内存泄漏检测等。Crash监控Crash......
  • 谷歌DeepMind—运用深度强化学习为双足机器人学习敏捷足球技能
    原文链接:OP3Soccer TakealookattheOP3Poweredby DYNAMIXEL看看由DYNAMIXEL驱动的OP3  WeinvestigatewhetherDeepReinforcementLearning(DeepRL)isabletosynthesizesophisticatedandsafemovementskillsforalow-cost,miniaturehumanoidrob......
  • C语言操作符深度解析
            目录一、操作符的分类1、算术操作符1、1、+和- 1、2、*1、3、/1、4、%2、赋值操作符:=和复合赋值2、1、连续赋值2、2、复合赋值符3、单⽬操作符:++、--、+、-3、1、++和--3、1、1、前置++3、1、2、后置++3、2、1、前置--3、2、2、后置--3、2......
  • 高性能计算-NEON-intrinsic函数
    1.对寄存器数据重排/*两个向量,每两个通道一组,第一个向量每组的后一个元素与第二个向量每组的第一个元素一次彼此交换*/#include<stdio.h>#include<arm_neon.h>voidmain(){intarrc[8]={0};intarrd[4]={0};intarre[4]={0};//1234//5......
  • 动手学深度学习10.6. 自注意力和位置编码-笔记&练习(PyTorch)
    本节课程地址:67自注意力【动手学深度学习v2】_哔哩哔哩_bilibili本节教材地址:10.6.自注意力和位置编码—动手学深度学习2.0.0documentation本节开源代码:...>d2l-zh>pytorch>chapter_multilayer-perceptrons>self-attention-and-positional-encoding.ipynb自注意力和......
  • 设计团队协作效率大揭秘!多款办公软件深度剖析与排行榜发布!
    在设计领域,J人(MBTI性格类型中倾向于计划、组织和控制的人群)组成的设计团队往往追求高效、有序的工作流程和精准的项目管理。然而,要实现这一目标,选择一款合适的办公软件至关重要。本文将为全J人设计团队盘点6款能够显著提升协作效率的办公软件,其中包括国产的板栗看板以及国外......