JavaScript深拷贝与浅拷贝的几种方式_javascript技巧

拷贝只复制对象第一层属性,深层仍共享引用;深拷贝递归复制所有层级,完全断开引用。常用浅拷贝方法有Object.assign()、扩展运算符、slice()/concat();深拷贝可使用JSON.parse(JSON.stringify())(有限制)、递归实现、structuredClone()或Lodash的cloneDeep()。示例表明浅拷贝修改嵌套属性会影响原对象,而深拷贝不会。手动实现深拷贝需处理对象、数组、基本类型及特殊类型,但简单递归未解决循环引用,生产环境推荐成熟库。选择方式应根据数据类型、性能需求和兼容性综合考虑。

javascript深拷贝与浅拷贝的几种方式_javascript技巧

JavaScript中的深拷贝和浅拷贝主要针对引用类型(如对象、数组)在赋值时的行为差异。浅拷贝只复制对象的第一层属性,深层嵌套仍共享同一引用;而深拷贝会递归复制所有层级,完全断开引用关系。下面介绍几种常见的实现方式。

浅拷贝的常用方法

浅拷贝适用于只需复制第一层属性的场景,修改嵌套属性时仍会影响原对象。

Object.assign():将源对象的所有可枚举属性复制到目标对象。注意仅复制一层。 扩展运算符 {…} :语法简洁,常用于对象或数组的浅复制。 Array.prototype.slice() / concat():适用于数组,生成新数组但不深拷贝内部元素。

示例:

// 对象浅拷贝
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = Object.assign({}, obj1);
obj2.b.c = 3;
console.log(obj1.b.c); // 输出 3,说明是浅拷贝

深拷贝的基本方法

深拷贝能彻底隔离新旧对象,适合复杂嵌套结构。

立即学习“Java免费学习笔记(深入)”;

JSON.parse(JSON.stringify()):最简单的方法,但有局限性,无法处理函数、undefined、Symbol、循环引用等。 递归实现深拷贝:手动遍历对象属性,对引用类型递归调用拷贝函数,可控性强。 使用结构化克隆算法(Structured Clone):部分浏览器支持,如 structuredClone(),支持多数数据类型。 第三方库(如 Lodash):提供成熟的 _.cloneDeep() 方法,兼容性好。

示例:JSON方式

const obj1 = { a: 1, b: { c: 2 } };
const obj2 = JSON.parse(JSON.stringify(obj1));
obj2.b.c = 3;
console.log(obj1.b.c); // 输出 2,成功深拷贝

手动实现一个简易深拷贝函数

通过类型判断和递归,可以处理大多数情况。

function deepClone(obj) {
  if (obj === null || typeof obj !== ‘object’) return obj;
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof Array) return obj.map(item => deepClone(item));
  if (typeof obj === ‘object’) {
    const cloned = {};
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        cloned[key] = deepClone(obj[key]);
      }
    }
    return cloned;
  }
}

这个版本能处理对象、数组、基本类型和嵌套结构,但未解决循环引用问题。生产环境建议使用成熟库。

注意事项与适用场景

选择拷贝方式需结合实际需求。

若对象不含函数、日期、Symbol 等特殊类型,JSON方法最快捷。 需要完整支持各种类型时,推荐使用 Lodash 的 cloneDeep。 频繁操作且性能敏感,可考虑优化的递归实现或 structuredClone(现代浏览器)。 注意循环引用会导致递归爆或JSON报错,需额外检测。

基本上就这些,理解原理后可根据项目需求灵活选择。

以上就是JavaScript深拷贝与浅拷贝的几种方式_javascript技巧的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1536569.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
使用正则表达式实现多参数命令的顺序无关解析
上一篇 2025年12月21日 03:23:54
JS条件语句怎么使用_JS条件语句ifelse及switch使用全攻略
下一篇 2025年12月21日 03:24:01

相关推荐

  • 高效图像处理:使用symisc/pixlab-php库提升应用效率

    在开发一个需要处理大量图像的应用时,我遇到了许多挑战。例如,需要快速准确地识别图像中的人脸,自动模糊敏感内容,以及从图像中提取文本信息。传统的图像处理方法效率低下,而且需要依赖多个不同的库,增加了开发的复杂度。 我尝试过一些其他的库,但都无法满足我项目的需求,直到我发现了symisc/pixlab-…

    用户投稿 2026年9月4日
    1400
  • Java远程调试(Remote Debugging)的那些事

    前言本文将探讨如何处理和调试那些仅在生产环境(或其他远程环境)中发生,而本地开发环境无法重现的“问题”。任何遇到这种情况的人都必须承认,试图找出这种“问题”原因的过程,很可能以一堆无根据的猜测告终:这是一个非常耗时且效率低下的过程。 还有一种情况,你得到了一个可以部署的war/jar包,只有clas…

    2026年9月4日
    000
  • Microsoft Edge浏览器加入自动跳过验证码选项功能

    验证码作为一种用于区分人类与机器的技术手段,尽管存在一定的局限性,却依然是广泛采用的安全措施之一。它的主要作用在于防范暴力破解攻击以及阻止非正常的大规模访问行为。验证码的表现形式多种多样,常见的包括数字与字母组合,也有通过点击图片文字或调整扭曲图片等方式来实现验证目的的类型。虽然验证码在一定程度上保…

    2026年9月4日
    000
  • 《女生宿舍 -女子宿舍的管理员-》两部作品官方中文版Steam商店页面现已开放

    《女生宿舍 -女子宿舍的管理员-》两部作品官方中文版Steam商店页面现已开放《女生宿舍 -女子宿舍的管理员-》两部作品官方中文版Steam商店页面现已开放《女生宿舍 -女子宿舍的管理员-》两部作品官方中文版Steam商店页面现已开放《女生宿舍 -女子宿舍的管理员-》两部作品官方中文版Steam商店页面现已开放

    shiravune荣幸地宣布,视觉小说《女生宿舍 -女子宿舍的管理员-》以及其续作《女生宿舍 -女子宿舍的管理员- after》将于2026年登陆steam平台! 《女生宿舍 -女子宿舍的管理员-》Steam 商店页面: https://www.php.cn/link/0bc31738ade477d…

    2026年9月4日 用户投稿
    300
  • 解决PHP Web应用数据更新延迟:浏览器缓存管理与实时内容展示

    本文深入探讨了PHP应用在本地开发环境中,当JSON数据或图片文件更新后,Web视图未能及时反映最新内容的问题。核心原因在于浏览器缓存机制。文章将详细介绍多种有效的解决方案,包括利用查询参数强制缓存失效、通过修改文件名实现版本控制,以及配置服务器端的缓存策略,旨在帮助开发者确保Web应用能够准确、实…

    2026年9月4日
    000
  • MySQL和Redis数据一致性:延迟双删与先改库再删缓存,哪种方案更优?

    MySQL和Redis数据一致性:如何选择延迟双删或先改库再删缓存? 在使用MySQL和Redis构建应用时,数据一致性至关重要。本文将对比分析两种常用的数据一致性方案:延迟双删和先修改数据库再删除缓存,并探讨其适用场景。 延迟双删策略 延迟双删是指先更新数据库,然后异步删除缓存。这种方法允许短暂的…

    2026年9月4日
    000
  • 快兔网盘怎么举报违规内容或文件_快兔网盘违规内容举报流程指南

    快兔网盘提供四种举报渠道:1. App内长按文件选择“举报”并提交;2. 网页端通过官网底部链接填写在线表单;3. 发送邮件至jubao@kutu.com,附证据材料;4. 拨打400-800-1234联系客服实名举报。 如果您在使用快兔网盘时发现违规内容或文件,为了维护良好的网络环境和自身权益,您…

    2026年9月4日
    200
  • SpringBoot+Kotlin整合MyBatis-Plus时,lateinit property未初始化该如何解决?

    SpringBoot、Kotlin与MyBatis-Plus整合时,lateinit property未初始化的错误排查与解决 在使用Kotlin开发SpringBoot项目并整合MyBatis-Plus时,经常会遇到lateinit property未初始化的错误。此问题通常发生在Service层…

    2026年9月4日
    100
  • 五小时史诗搬上银幕!《天国:拯救2》电影剪辑版将亮相国际电影节

    尽管《天国:拯救2》极有可能角逐2025年度游戏大奖,但开发商战马工作室显然怀揣更宏大的野心。这款中世纪角色扮演游戏的电影剪辑版已确认将于下月在电影节首映。 7月9日,长达五小时的《天国:拯救2》电影剪辑版将在捷克卡罗维发利国际电影节举行全球首映。据《好莱坞报道》披露,该版本将完整呈现铁匠之子亨利·…

    2026年9月4日
    000
  • PHP中动态获取调用者文件命名空间的高级技巧

    本文探讨了在php中如何在不作为参数传递的情况下,动态获取调用当前方法的文件的命名空间。通过结合debug_backtrace()函数追踪调用栈获取调用者文件路径,并利用token_get_all()对文件内容进行词法分析,从而精确提取出调用者文件中声明的命名空间。这为需要在运行时感知调用上下文的p…

    2026年9月4日
    100
  • VSCode怎么插动图_VSCode插入GIF动图与预览动态效果教程

    VSCode无法直接在编辑器中播放GIF,但可通过Markdown预览功能实现动图展示。具体步骤为:将GIF文件放入项目目录或使用网络链接,在.md文件中用![描述](路径)语法插入,再通过Ctrl+Shift+V打开预览窗口即可动态查看。此方法利用内置渲染引擎,不需额外插件,适用于文档编写;也可安…

    2026年9月4日
    400
  • deepseek中文官网入口

    Deepseek 是一款旨在增强网络安全和隐私的创新搜索引擎。与传统搜索引擎不同,Deepseek 在注重用户隐私和数据保护的同时提供准确的搜索结果。该平台利用先进的加密技术和匿名化协议,确保用户搜索活动的保密性。Deepseek 还在其搜索结果中无缝集成分散式网络,允许用户访问传统搜索引擎难以触及…

    2026年9月4日
    200
  • 高效日志缓冲:使用 Travail/Log-Buffered 提升应用性能

    在构建一个高吞吐量的实时数据处理系统时,我面临着一个棘手的问题:大量的日志记录严重影响了系统的整体性能。传统的日志记录方式,每次操作都直接写入日志文件,导致i/o操作频繁,成为系统的瓶颈。这不仅降低了处理速度,还增加了服务器负载。为了解决这个问题,我开始寻找更高效的日志记录方案。 经过一番调研,我找…

    用户投稿 2026年9月4日
    000
  • 基于PHP实现登录用户专属文件下载访问控制

    本教程旨在解决用户登录后才能下载特定文件,而未登录用户即使知晓文件路径也无法访问的问题。通过介绍一种基于PHP脚本的解决方案,替代传统.htaccess的限制,实现对文件下载的精细化权限控制,确保只有经过身份验证的用户才能获取指定资源。 引言:登录用户文件下载的挑战 在web应用中,我们经常需要提供…

    2026年9月4日
    100
  • 渗透测试安全检测漏洞

    最近由于渗透测试任务繁重,笔者一直未能抽出时间撰写文章。今天,我们sine安全的渗透主管将为大家普及java安全测试的基础知识。许多客户希望了解具体的javascript调用漏洞、提交payload的过程,以及如何获取最高权限、绕过登录等执行命令漏洞的安全检测方法。 4.4.1.1. 显式原型和隐式…

    2026年9月4日
    100
  • 使用本地化资源动态配置 Java Switch 语句

    本文探讨了在 Java 中如何根据不同的区域设置,动态地配置 `switch` 语句。由于 `switch` 语句的 `case` 标签必须是常量表达式,直接使用资源文件中的字符串值是不允许的。本文提供了两种解决方案:使用 `if-else if` 语句替代 `switch`,以及使用 `Map` …

    2026年9月4日
    100
  • edge浏览器怎么截图 edge浏览器截图方法

    edge浏览器怎么截图 edge浏览器截图方法edge浏览器怎么截图 edge浏览器截图方法edge浏览器怎么截图 edge浏览器截图方法edge浏览器怎么截图 edge浏览器截图方法

    点击浏览器右上角类似笔记本图标的“做web笔记”按钮,会打开一个菜单栏。 菜单栏左侧包括“笔”、“荧光笔”、“橡皮擦”、“添加键入的笔记”和“剪辑”功能, 右侧则有“做WEB笔记”、“共享”以及“退出”选项。 使用截图功能时,点击“剪辑”,界面上会出现“拖动以复制区域”的提示,同时鼠标指针变为“+”…

    2026年9月4日 用户投稿
    000
  • 百度浏览器如何设置无图模式 百度浏览器设置无图模式教程

    百度浏览器怎么开启无图模式?用户如何在该应用中找到无图模式的功能?想要启用该功能具体该怎么操作?百度浏览器是一款广受用户欢迎的手机端浏览工具,用户可以在这个平台上使用多个搜索引擎来查找信息。其搜索能力强大,并且支持多种浏览设置,可以根据不同场景进行个性化调整。虽然平台会加载图片内容,但有时候图片会影…

    2026年9月4日
    000
  • ​​无法定位程序输入点于动态链接库?错误修复指南​​

    重新安装或修复出错程序,确保安装完整且无残留;2. 运行sfc++ /scannow和dism命令修复系统文件,必要时手动替换受损dll;3. 更新或重装microsoft visual c++ redistributable和.net framework等运行库;4. 更新驱动程序和系统补丁,确保…

    2026年9月4日
    400
  • Spryker Elasticsearch 日志监控:提升应用可观测性

    在 spryker 电商平台的开发过程中,我们经常与 elasticsearch 交互进行搜索和数据检索。然而,在早期版本中,我们缺乏对 elasticsearch api 调用细节的有效监控机制。当出现搜索异常或性能问题时,定位问题根源变得异常困难,这严重影响了我们的开发效率和运维效率。 日志信息…

    用户投稿 2026年9月4日
    000

发表回复

登录后才能评论
关注微信