深拷贝的实现方式

深拷贝的实现方式主要有以下几种,这些方式在处理不同的情况时各有优劣:

递归函数实现:

原理:通过递归的方式遍历对象的所有属性,如果属性是基本类型则直接复制,如果属性是引用类型

  • 则继续递归拷贝。
  • 示例代码(简化版):
function deepClone(source) {  if (!source || typeof source !== 'object') {  return source;  }  let targetObj = source.constructor === Array ? [] : {};  for (let key in source) {  if (source.hasOwnProperty(key)) {  if (source[key] && typeof source[key] === 'object') {  targetObj[key] = deepClone(source[key]);  } else {  targetObj[key] = source[key];  }  }  }  return targetObj;  
}
  • 优点:可以处理复杂的数据结构,包括循环引用和嵌套对象。
  • 缺点:实现起来相对复杂,需要处理各种边界情况。

JSON序列化与反序列化:

  • 原理:先将对象转换成JSON字符串,再将JSON字符串转回对象。由于JSON字符串中存储的是对象的值而不是引用,因此可以实现深拷贝。
  • 示例代码:
const obj = { ... }; // 原始对象  
const obj2 = JSON.parse(JSON.stringify(obj)); // 深拷贝后的对象
  • 优点:实现简单,代码量少。
  • 缺点:无法处理函数、循环引用、undefined和特殊的对象类型(如Date、RegExp)。同时,这种方法会忽略对象的getter和setter方法。

使用第三方库:

  • 原理:利用成熟的第三方库(如lodash的_.cloneDeep方法)来实现深拷贝。
  • 示例代码:
const _ = require('lodash');  
const obj = { ... }; // 原始对象  
const obj2 = _.cloneDeep(obj); // 深拷贝后的对象
  • 优点:功能强大,处理各种复杂情况的能力强,且代码简洁。
  • 缺点:需要引入额外的库,可能增加项目的大小和复杂度。

MessagePack、Protocol Buffers等序列化协议:

  • 原理:这些协议提供了序列化和反序列化的功能,也可以用来实现深拷贝。它们通常比JSON更高效,但实现起来也更复杂。
  • 优点:序列化后的数据体积小,传输效率高,适用于跨语言、跨平台的数据交换。
  • 缺点:实现复杂,需要学习新的协议和API。

其他方式:

  • 还有一些其他的方法可以实现深拷贝,如使用Web API(如structuredClone)或浏览器的Clipboard
    API等。这些方法通常具有特定的应用场景和限制。

在选择深拷贝的实现方式时,需要根据具体的应用场景和需求来选择最适合的方法。
例如,

  • 在处理简单的数据结构时,可以使用JSON序列化与反序列化的方式;
  • 在处理复杂的数据结构或需要跨语言、跨平台的数据交换时,可以使用MessagePack、Protocol Buffers等序列化协议;
  • 在处理大型对象或需要频繁进行拷贝操作的情况下,需要权衡性能和内存使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/848021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三.网络编程套接字_TCP

一.序言 在上一章中,我们已经实现了用udp来实现网络编程,这一节我们用tcp来实现网络编程,通过对比两者编写过程的区别,来加深对udp,tcp的理解! (两者其实差别不大!有了udp的基础,学习起来tcp会…

记录Object.defineProperty使用以及Proxy的使用

1.Object.defineProperty使用: // 本体 const obj1 {a: 1,b: 2,c: 3, };// 通过代理对象 来监听本体修改 const definePropertyObj {}; // 使用Object.defineProperty监听对象 for (const key in obj1) {Object.defineProperty(definePropertyObj, key, {get() {c…

按摩师 | 打家劫舍 | 删除并获得点数 | 动态规划

1.按摩师(打家劫舍 I) 题目连接:面试题 17.16. 按摩师 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列&am…

java基础filter servlet interceptor controller之间的关系

servlet Servlet是运行在Web服务器上的Java类。它们主要用于处理HTTP请求和响应。 Servlet可以接收来自客户端(例如浏览器)的HTTP请求并生成响应,这些响应通常是HTML页面、XML文档或其他格式的数据。Servlet通常被设计用来扮演Web应用的控制…

selenium 输入框、按钮,输入点击,获取元素属性等简单例子

元素操作 nput框 输入send_keys, input框 清除clear(), 按钮 点击click() 按钮 提交submit() 获取元素, tag_name、 class属性值、 坐标尺寸 """ input框 输入1次,再追加输入一次, 清除&#xff0c…

PyQt5学习系列之基础知识“字典”

PyQt5学习系列之基础知识——字典” 啰嗦字典使用字典取值与赋值其他使用 总结 啰嗦 在项目中使用到解析数据存放在字典中,对字典中的数据进行数据转化。即需要使用到字典,并对字典中的数据取值。 字典 一种可变容器模型存储任意类型对象每个键值对&am…

视频监控管理平台智能边缘分析一体机安防管理平台客流统计检测算法商场的场景应用方案

随着科技的不断发展,智能化技术已经广泛应用于各个领域。在商业领域,智能边缘分析一体机作为一种新兴的技术手段,为商场提供了一种高效、准确的客流统计方法。本文将探讨智能边缘分析一体机在商场客流统计中的应用方案。 商场作为人们日常生活…

【c语言】自定义类型-结构体

结构体 结构体的声明与使用结构体的声明与初始化结构体的自引用 结构体的内存对齐对齐规则为什么存在内存对齐修改默认对齐数 结构体的传参结构体实现位段什么是位段位段的内存分配位段的跨平台问题位段使用的注意事项 结构体:是一个自定义的类型,成员可…

利用CY3-COOH的羧基官能团标记蛋白质-星戈瑞

蛋白质作为生命体系中的关键分子,参与众多生物过程。因此,对蛋白质进行特异性标记和追踪是生物学研究中不可或缺的一环。CY3-COOH作为一种带有羧基官能团的荧光染料,具有强烈且稳定的荧光性质,被应用于蛋白质的标记和可视化。 标…

JavaScript严格模式

1. 严格模式 ECMAScript 5的严格模式是采用具有限制性 JavaScript 变体的一种方式,从而使代码隐式地脱离“马虎模式/稀松模式/懒散模式“(sloppy)模式。严格模式不仅仅是一个子集:它的产生是为了形成与正常代码不同的语义。不支持…

使用Docker辅助图像识别程序开发:在Docker中显示GUI、访问GPU、USB相机以及网络

目录概览 引言安装和配置安装docker安装nvidia-docker在docker中显示GUI在Docker中访问usb相机在Docker镜像中开放端口开启更多的GPU功能支持创建本地镜像中心一些可选参数上传镜像回收空间清理所有的无用镜像清理指定的镜像GPU Docker with Anaconda第一种方式:构建DockerFile…

【微信小程序】事件绑定和事件对象

文章目录 1.什么是事件绑定2.button组件3.事件绑定4.input组件 1.什么是事件绑定 小程序中绑定事件与在网页开发中绑定事件几乎一致,只不过在小程序不能通过on的方式绑定事件,也没有click等事件,小程序中 绑定事件使用bind方法,c…

【ArcGIS微课1000例】0116:将度-分-秒值转换为十进制度值(字段计算器VBA)

相关阅读:【ArcGIS微课1000例】0087:经纬度格式转换(度分秒转度、度转度分秒) 文章目录 一、计算方法二、计算案例一、计算方法 将度分秒转换为十进制度的简单等式: DD = (Seconds/3600) + (Minutes/60) + Degrees如果角度值是负数,则转换方法不同。其中一种方法是:

外贸实战|做外贸要主动,才会跟客户有订单!

很多人对我说过这种情况:客户给我发了一份询盘,但是我回复以后,客户就不理我了,好伤心。 我问:你跟了多久了? 很多人都会回答:几天或者不记得,他不理我,我也不知道怎么…

Spring Boot的@Async注解有哪些坑需要避免

一、什么是Async注解? Async注解是Spring框架提供的一种用于声明异步方法的工具。它可以将标注的方法从调用者的线程中分离出来,另起一个新线程执行,从而避免阻塞调用者的线程,提高系统的并发能力和响应速度。 基本使用方法如下&a…

Redis页面优化

文章目录 1.Redis页面缓存1.思路分析2.首先记录一下目前访问商品列表页的QPS1.线程组配置10000次请求2.请求配置3.开始压测1.压测第一次 平均QPS为6122.压测第二次 平均QPS为6153.压测第三次 平均QPS为617 3.然后记录一下访问商品详情页的QPS1.线程组配置10000次请求2.请求配置…

AIGC简介:如何利用人工智能进行内容生成

目录 一、引言二、AIGC的定义与技术原理1. 定义说明2. 关键技术3. 技术原理 三、AIGC的主要应用领域1. 文本内容生成2. 图像和视频生成3. 音频内容的创建4. 数据分析与报告 四、实施AIGC的步骤和方法1. 定义项目目标2. 数据准备与处理3. 选择合适的工具和技术4. 模型训练与测试…

uni-app学习--基础组件使用、页面生命周期、本地存储、网络请求、条件编译、路由跳转

文章目录 1. 基本组件的使用1. text文本组件的使用2. view视图容器组件的使用3. button按钮组件的使用4. image组件的使用5. map组件 2. uni-app中的样式1. uni-app:px2rpx计算 3. uni-app的数据绑定1. 基本的数据绑定2. v-bind,v-for,v-on 4. uni-app的生命周期1. …

服务器数据恢复—raid5阵列上分配的卷被删除后重建如何恢复被删除卷的数据?

服务器存储数据恢复环境: 某品牌FlexStorage P5730服务器存储,存储中有一组由24块硬盘组建的RAID5阵列,包括1块热备硬盘。 服务器存储故障: 存储中的2个卷被删除,删除之后重建了一个新卷。需要恢复之前删除的一个卷的数…

等保题目分享(60000字版)

文章目录 前言判断题单选题多选题简答题 前言 来源于网友会议 判断题 在对数据进行差异备份前,仍需进行数据库的全量备份。(T) 某应用系统后台连续登录失败3次以后,需要输入验证码才能继续登录,这个应用系统实现了登录失败处理…