JS中【浅克隆】和【深克隆】方法解读

在JavaScript中,“克隆”指的是创建一个对象或数组的副本。克隆可以分为浅克隆深克隆两种方式。了解这两种克隆的差异对编程非常重要。

浅克隆(Shallow Clone)

浅克隆会复制对象或数组的第一层属性,但对于嵌套的对象或数组,它们只复制引用,而不是实际的数据。

浅克隆的方法:
  1. Object.assign():

    const obj = { a: 1, b: { c: 2 } };
    const clone = Object.assign({}, obj);
    clone.b.c = 3;
    console.log(obj.b.c); // 输出 3
    

    这里,Object.assign 只对对象的第一层进行了复制,b对象的引用被复制,因此修改cloneb.c属性会影响原对象。

  2. 扩展运算符 ...:

    const obj = { a: 1, b: { c: 2 } };
    const clone = { ...obj };
    clone.b.c = 3;
    console.log(obj.b.c); // 输出 3
    

    这个方法同样是浅克隆。

深克隆(Deep Clone)

深克隆会递归地复制对象或数组的所有嵌套属性,使得新对象与原对象完全独立。

深克隆的方法:
  1. JSON.parse(JSON.stringify()):

    const obj = { a: 1, b: { c: 2 } };
    const deepClone = JSON.parse(JSON.stringify(obj));
    deepClone.b.c = 3;
    console.log(obj.b.c); // 输出 2
    

    这种方法适用于简单的对象和数组,不适合处理函数、undefinedNaNInfinity等特殊值。

  2. 递归克隆:
    可以手动编写递归函数来进行深克隆,这样可以处理更复杂的对象结构,包括函数和特殊值。

    function deepClone(obj) {if (obj === null || typeof obj !== 'object') {return obj;}if (Array.isArray(obj)) {return obj.map(item => deepClone(item));}const clone = {};for (let key in obj) {if (obj.hasOwnProperty(key)) {clone[key] = deepClone(obj[key]);}}return clone;
    }const obj = { a: 1, b: { c: 2 } };
    const clone = deepClone(obj);
    clone.b.c = 3;
    console.log(obj.b.c); // 输出 2
    

总结

  • 浅克隆:适用于简单对象或只需要复制第一层属性的情况。
  • 深克隆:适用于复杂的嵌套对象,确保新对象与原对象完全独立。

选择使用哪种克隆方法取决于你的具体需求和对象的复杂性。

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

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

相关文章

如何通过rsync+sersync 实现同步备份

该文档是在很早之前写的,一直存在草稿箱中,最近在整理其它学习资料时发现还没有发布,内容和方法有可能和现在的操作系统版本有些不符合了,但处理思路没有变化,大家可以根据最新版本要求,参照该文档进行配置…

JVM调优原理

文章目录 引言I 调整JVM的默认堆内存配置1.1 java命令启动jar包时配置JVM 的内存参数1.2 基于Tomcat服务器部署的java应用,配置JVM 的内存参数II JVM GC 调优基本概念: 应用程序的响应时间(RT)和吞吐量(QPS)JVM调优原理调优思路调优方法JVM调优技巧建议引言 内存参数:ht…

南阳施工企业资质续期成本详解与节省策略

南阳施工企业资质续期费用涉及多个方面,包括官方收取的费用、咨询与代办费用、材料准备与审核费用等。以下是对这些费用的详细解析以及相应的节省方法: 一、费用详述 1. 官方收取的费用 延期申请费:这是办理资质续期时必须缴纳的费用&…

闲置物品|基于SprinBoot+vue的校园闲置物品交易平台(源码+数据库+文档)

校园闲置物品交易平台 目录 基于SprinBootvue的校园闲置物品交易平台 一、前言 二、系统设计 三、系统功能设计 5.1系统功能实现 5.2管理员模块实现 5.3用户模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xf…

项目:基于TCP的文件传输系统

项目介绍: 模拟FTP原理:客户端连接服务器后,向服务器发送一个文件。文件名可以通过参数指定,服务器端接收客户端传来的文件(文件名随意),如果文件不存在自动创建文件,如果文件存在,…

PsConvertToGuiThread函数调用前传

PsConvertToGuiThread函数调用前传 第一部分:位置 chchenghaodeiMac base % grep "Kss_ErrorHandler" -nr ./ .//ntos/ke/i386/trap.asm:1026:Kss_ErrorHandler: .//ntos/ke/i386/trap.asm:1220: jae Kss_ErrorHandler ; if ae, try…

matlab 相位解缠

目录 一、功能概述1、相位解缠2、主要函数二、代码实现1、螺旋线的正确相位角2、使用不同阈值平移相位角3、将相移应用于矩阵三、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 一、功能概述 1、相位解缠 对…

FPGA实现多功能SDI视频采集卡,基于GTX+RIFFA架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案本博已有的 SDI 编解码方案 3、详细设计方案设计框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGBFDMA图像缓存RIFFA用户数据控制RIFFA架构详解Xilinx 7 Series Integrated Bloc…

C#面:ASP.NET MVC 中还有哪些注释属性用来验证?

在 ASP.NET MVC 中,除了常见的数据注解属性(如Required、StringLength等),还有一些其他的注解属性用来验证数据。以下是一些常用的注解属性: Range:用于验证数字类型的属性值是否在指定的范围内。 [Range(…

中文乱码解决方案

解决程序中的中文乱码问题通常涉及到几个关键点:字符编码的设置、环境变量的配置以及程序内部处理方式。这里提供一些常见的解决方案: 1. 设置正确的输入输出流编码 如果你的应用程序是在读取或写入文件时出现乱码,确保设置了正确的文件编码…

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器) 文章目录 一、基本原理鲸鱼智能优化特征选择流程 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序…

从地图信息实时检测路口的各向通行状况、红绿灯及溢出情况

高德地图、百度地图都能获得实时的道路信息。 C# 编写的路况信息爬虫可获得准实时(1分钟间隔)的路口的各向通行状况、红绿灯及溢出情况。 优势: 投入少,效果好,无需安装设备; 缺陷: 时间间隔…

人工智能在网络安全领域的应用探索

随着网络技术的飞速发展,网络安全问题日益凸显,成为制约数字化进程的重要瓶颈。人工智能(AI)作为一种变革性技术,正逐步在网络安全领域展现出其巨大的潜力和价值。本文旨在探讨人工智能在网络安全领域的应用现状、优势…

更新RK3588开发板的rknn_server和librknnrt.so【这篇文章是RKNPU2从入门到实践 --- 【5】的配套文章】

作者使用的平台有: 一台装有Windows系统的宿主机,在该宿主机上装有Ubuntu 20.04虚拟系统; 瑞芯微RK3588开发板,开发板上的系统为Ubuntu22.04系统; 更新板子的 rknn_server 和 librknnrt.so,rknn_server 和…

单HTML文件集成Vue2+axios的使用

1、下载vue2.js和axios.js到本地 2、建一个HTML文件&#xff0c;内容如下&#xff1a; <html> <head><meta charset"UTF-8"><script src"./js/vue2.js"></script><script src"./js/axios.js"></script&…

USART之串口发送+接收应用案例

文章目录 前言一、电路接线图二、应用案例代码三、应用案例分析3.1 USART模块初始化3.1.1 RCC开启时钟3.1.2 GPIO初始化3.1.3 配置USART3.1.4 开启中断、配置NVIC3.1.5 开启USART 3.2 USART串口收发模块3.2.1 Serial_SendByte&#xff08;发送一个字节数据&#xff09;3.2.2 US…

Array常用的函数

在JavaScript中&#xff0c;Array 对象提供了许多实用的方法来操作数组。以下是常用的几个函数及其简要说明&#xff1a; 1. Array.prototype.forEach forEach 用于遍历数组中的每个元素&#xff0c;并执行一个提供的函数。 语法 array.forEach(callback(currentValue[, in…

【蓝桥杯集训100题】scratch绘制扇子 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第28题

scratch绘制扇子 蓝桥杯集训100题第28题模拟练习解析 此题曾经作为第十届省赛的真题考过 一、题目要求 以坐标(0,0)点为中心绘制一把扇子;扇面和扇把都是三分之一圆,扇面的半径 为 100 左右,扇把的半径为 20 左右。 编程实现 每次点击绿旗后,舞台背景为白色,…

【自动驾驶】控制算法(六)前馈控制与航向误差

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

vue按钮弹框

在Vue中实现按钮点击后弹出对话框&#xff08;弹框&#xff09;的功能&#xff0c;通常可以使用一些Vue的UI组件库&#xff0c;如Element UI、Vuetify、BootstrapVue等&#xff0c;这些库提供了丰富的组件&#xff0c;包括对话框&#xff08;Dialog&#xff09;、模态框&#x…