深浅拷贝区别,怎么区别使用

在 JavaScript 中,深拷贝(Deep Copy) 和 浅拷贝(Shallow Copy) 是两种不同的对象复制方式,它们的区别主要体现在对嵌套对象的处理上。以下是它们的详细对比及使用场景:


1. 浅拷贝(Shallow Copy)

  • 定义:

    • 浅拷贝只复制对象的第一层属性,如果属性是基本类型(如 stringnumberboolean),则直接复制值;如果属性是引用类型(如 objectarray),则复制引用(内存地址)。

    • 浅拷贝后的对象和原对象共享嵌套的引用类型数据。

  • 实现方式:

    • 使用 Object.assign():

      const obj = { a: 1, b: { c: 2 } };
      const shallowCopy = Object.assign({}, obj);
    • 使用扩展运算符(...):

      const obj = { a: 1, b: { c: 2 } };
      const shallowCopy = { ...obj };
  • 特点:

    • 修改浅拷贝对象的第一层属性不会影响原对象。

    • 修改浅拷贝对象的嵌套对象属性会影响原对象。

  • 示例:

    const obj = { a: 1, b: { c: 2 } };
    const shallowCopy = { ...obj };shallowCopy.a = 10; // 修改第一层属性
    shallowCopy.b.c = 20; // 修改嵌套对象属性console.log(obj); // { a: 1, b: { c: 20 } } (嵌套对象被修改)
    console.log(shallowCopy); // { a: 10, b: { c: 20 } }

2. 深拷贝(Deep Copy)

  • 定义:

    • 深拷贝会递归复制对象的所有层级属性,包括嵌套的引用类型数据。

    • 深拷贝后的对象和原对象完全独立,互不影响。

  • 实现方式:

    • 使用 JSON.parse(JSON.stringify()):

      const obj = { a: 1, b: { c: 2 } };
      const deepCopy = JSON.parse(JSON.stringify(obj));
      • 注意:这种方法无法复制函数、undefinedSymbol 等特殊类型。

    • 使用递归函数或工具库(如 Lodash 的 _.cloneDeep):

      const _ = require('lodash');
      const obj = { a: 1, b: { c: 2 } };
      const deepCopy = _.cloneDeep(obj);
  • 特点:

    • 修改深拷贝对象的任何属性都不会影响原对象。

    • 深拷贝会完全复制对象的所有层级数据。

  • 示例:

    const obj = { a: 1, b: { c: 2 } };
    const deepCopy = JSON.parse(JSON.stringify(obj));deepCopy.a = 10; // 修改第一层属性
    deepCopy.b.c = 20; // 修改嵌套对象属性console.log(obj); // { a: 1, b: { c: 2 } } (原对象不受影响)
    console.log(deepCopy); // { a: 10, b: { c: 20 } }

3. 浅拷贝和深拷贝的区别

特性浅拷贝(Shallow Copy)深拷贝(Deep Copy)
复制层级只复制第一层属性递归复制所有层级属性
嵌套对象嵌套对象是引用(共享内存地址)嵌套对象是独立的(不共享内存地址)
性能性能较高性能较低(递归复制)
实现方式Object.assign()、扩展运算符JSON.parse(JSON.stringify())、递归函数、工具库
适用场景对象结构简单,无需复制嵌套对象对象结构复杂,需要完全独立的对象

4. 如何选择使用浅拷贝和深拷贝

  • 使用浅拷贝的场景:

    • 对象结构简单,没有嵌套对象或数组。

    • 只需要复制第一层属性,且不关心嵌套对象是否共享。

    • 性能要求较高,且不需要完全独立的对象。

  • 使用深拷贝的场景:

    • 对象结构复杂,包含嵌套对象或数组。

    • 需要完全独立的对象,修改拷贝对象不影响原对象。

    • 不关心性能开销,且需要完整的复制。


5. 总结

  • 浅拷贝:

    • 只复制第一层属性,嵌套对象是引用。

    • 适合简单对象或性能敏感的场景。

  • 深拷贝:

    • 递归复制所有层级属性,嵌套对象是独立的。

    • 适合复杂对象或需要完全独立的场景。

根据实际需求选择合适的拷贝方式,可以避免不必要的性能开销和潜在的错误。

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

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

相关文章

tailscale + derp中继 + 阿里云服务器 (无域名版)

使用tailscale默认的中转节点延迟很高,因为服务器都在国外。 感谢大佬提供的方案:Tailscale 搭建derp中继节点,不需要域名,不需要备案,不需要申请证书(最新) - yafeng - 博客园 基于这个方案&…

【异常错误】pycharm debug view变量的时候显示不全,中间会以...显示

异常问题: 这个是在新版的pycharm中出现的,出现的问题,点击view后不全部显示,而是以...折叠显示 在setting中这么设置一下就好了: 解决办法: https://youtrack.jetbrains.com/issue/PY-75568/Large-stri…

【DeepSeek系列】04 DeepSeek-R1:带有冷启动的强化学习

文章目录 1、简介2、主要改进点3、两个重要观点4、四阶段后训练详细步骤4.1 冷启动4.2 推理导向的强化学习4.3 拒绝采样和有监督微调4.4 针对所有场景的强化学习 5、蒸馏与强化学习对比6、评估6.1 DeepSeek-R1 评估6.2 蒸馏模型评估 7、结论8、局限性与未来方向 1、简介 DeepS…

车载音频配置(二)

目录 OEM 自定义的车载音频上下文 动态音频区配置 向前兼容性 Android 14 车载音频配置 在 Android 14 中,AAOS 引入了 OEM 插件服务,使你可以更主动地管理由车载音频服务监督的音频行为。 随着新的插件服务的引入,车载音频配置文件中添加了以下更改: • OEM 自定义的车…

禁止WPS强制打开PDF文件

原文网址:禁止WPS强制打开PDF文件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何避免WPS强制打开PDF文件。 方法 1.删除注册表里.pdf的WPS绑定 WinR,输入:regedit,回车。找到:HKEY_CLASSES_ROOT\.pdf删除KWPS.PDF…

深入解析NoSQL数据库:从文档存储到图数据库的全场景实践

title: 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践 date: 2025/2/19 updated: 2025/2/19 author: cmdragon excerpt: 通过电商、社交网络、物联网等12个行业场景,结合MongoDB聚合管道、Redis Stream实时处理、Cassandra SSTable存储引擎、Neo4j路径遍历算法等42…

用 Biome 替代 ESLint 和 Prettier

简介 ESLint 和 Prettier ESLint:代码质量检查工具,确保代码风格一致与无错误 Prettier:代码格式化工具,自动美化代码布局 所以:ESLint Prettier 能自动美化代码、自动检查代码错误的工具 Biome Biome:…

6.3 DBMS的功能和特征

文章目录 DBMS的6大功能DBMS的3个特征DBMS的分类 DBMS的6大功能 DBMS包含数据定义,数据库操作(检索、插入、修改、删除),数据库运行管理(保证多用户环境下正常运行),数据组织、存储、管理&…

力扣hot100——找到字符串中的所有字母异位词

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 解法思路: 1. // 判断字符相等,其实就是给定一个定长的窗口去滑动查找子串,为了便于判断将p 与窗口中的子…

前端插件使用xlsx-populate,花样配置excel内容,根据坐添加标替换excel内容,修改颜色,合并单元格...。

需求要求:业务人员有个非常复杂得excel表格,各种表头等,但是模板是固定得。当然也可以实现在excel上搞出各种表格,但是不如直接用已有模板替换其中要动态得内容方便,这里我们用到CSDN得 xlsx-populate 插件。 实列中我…

未来AI方向落地场景:小语言模型,super_private_agent

未来AI方向落地场景:小语言模型,super_private_agent 目录 未来AI方向落地场景:小语言模型,super_private_agent小语言模型super - private - agent(注重隐私的智能代理)碳基生命和硅基生命交互界面面向agent的专用交互协议和数据接口从web平台经济到网络平台举例说明社交…

Coze扣子新功能详解

今晚(2025-01-24)扣子再次进行更新 主要更新内容: 搭建小程序和 H5 用户界面时,支持使用音频组件播放音频内容 数据库操作体验提升 界面优化:对数据库详情界面进行了重新设计,并将工作流运行数据库的测试数据位置从原工作流底…

汇能感知的光谱相机/模块产品有哪些?

CM020A 分辨率:1600H1200V 光谱范围:350~950nm 光谱分辨率:1nm 接口:USB2.0 帧率:16001200 (6帧) 输出格式:Raw 8bit FOV:D73.5H58.8V44.1 相机尺寸:505055mm VM02S10 分辨率…

Ollama 本地GUI客户端:为DeepSeek用户量身定制的智能模型管理与交互工具

Ollama 本地GUI客户端:为DeepSeek用户量身定制的智能模型管理与交互工具 相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例&#xf…

OpenMv识别色块通过串口发给STM32

硬件连接 1、Openmv端 这里OpenMV端仅作为数据的发送端,所以只需要共地,以及OpenMV的TX(P4)与开发板的RX端连接即可。 2、STM32端 将开发板连接STM芯片RX端与转串口TX端的跳帽取下,再将OpenMV的TX端(P4)与STM的RX连接。如果使用USB转TTL则将TTL的RX端与STM的TX端连接…

以太网交换基础(涵盖二层转发原理和MAC表的学习)

在当今的网络世界中,以太网交换技术是局域网(LAN)的核心组成部分。无论是企业网络、学校网络还是家庭网络,以太网交换机都扮演着至关重要的角色。本文将详细介绍以太网交换的基础知识,包括以太网协议、帧格式、MAC地址…

菜鸟之路Day15一一IO流(一)

菜鸟之路Day15一一IO流(一) 作者:blue 时间:2025.2.8 文章目录 菜鸟之路Day15一一IO流(一)0.概述1.初识IO流1.1.什么是IO流?1.2.IO流的作用1.3.IO流的分类 2.IO流的体系结构3.字节输出流的基本…

汽车零部件开发应该具备哪些编程思维?

目录 1、功能安全思维 2、实时性与确定性思维 3、可靠性和冗余思维 4、硬件软件协同思维 5、CAN总线通信思维 6、故障诊断和自诊断思维 7、功耗优化思维 8、软件更新和版本管理思维 9、用户体验与安全性思维 汽车零部件开发中,嵌入式软件在车辆系统中的作用…

idea拉取合并后的分支

文章目录 远程拉取代码.更新本地库拉取后本地库就有了合并后的代码 远程拉取代码.更新本地库 拉取后本地库就有了合并后的代码

1-18 GIT设置公钥

1-1 GIT如何设置公钥 1.0 注册账号 这个应该都是会的,就不做介绍了 2.0 设置公钥 PWD的作用是查看文件的路径 ssh-keygen -t ed25519 -C "Gitee SSH Key" 读取公钥文件: cat ~/.ssh/id_ed25519.pub 3.0 测试 查看绑定的用户名和邮箱&#xff1…