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
下一篇 2025年12月21日 03:24:01

相关推荐

  • React Fetch与PHP后端数据交互:表单数据传输与接收的最佳实践

    本文详细阐述了如何通过react应用中的fetch api向php后端安全有效地发送表单数据,并确保php正确接收。核心在于前端fetch请求需正确配置`content-type`为`application/x-www-form-urlencoded`并使用`urlsearchparams`构造请求…

    2025年12月21日
    000
  • js创建数组的三种方法

    JavaScript中创建数组的三种常用方法:1. 数组字面量 [] 最简洁,适合已知元素时使用;2. Array构造函数 new Array() 可按参数创建指定长度或元素的数组,但单个数字易引发歧义;3. ES6的 Array.of() 方法能准确创建包含指定元素的数组,避免了构造函数的陷阱,行…

    2025年12月21日
    000
  • NReco.PdfGenerator:高级页面编号自定义教程

    本教程详细介绍了在nreco.pdfgenerator中自定义pdf页面编号的两种高级方法。首先,通过`generatepdffromfiles`方法结合`–page-offset`参数,实现对不同html输入文件的起始页码控制;其次,展示了如何通过修改页脚html中的javascrip…

    2025年12月21日
    000
  • JS数组排序怎么实现_JavaScript数组排序方法与自定义排序教程

    JavaScript数组排序默认按字符串Unicode码点排序,需用sort()方法;数字排序须提供比较函数,如(a, b) => a – b实现升序;对象数组可按属性排序,常用a.age – b.age或a.name.localeCompare(b.name);注意s…

    2025年12月21日
    000
  • 实现AngularJS中日期选择器联动:自动弹出第二个日期选择器

    本文详细介绍了如何在angularjs应用中实现两个日期选择器(datetimepicker)的联动效果。当用户在第一个日期选择器中完成日期选择后,如果第二个日期选择器尚未填写,它将自动弹出。文章以angular ui bootstrap的日期选择器为例,通过`ng-change`事件和控制`is-…

    2025年12月21日
    000
  • 根据配置动态构建数组:JavaScript条件筛选实践

    本教程详细阐述了如何在javascript中根据外部配置动态筛选并构建数组。通过遍历配置对象并结合条件判断,我们可以轻松地将符合特定条件的元素(例如,配置中设置为true的项)收集到一个新的数组中。这种方法在界面渲染、功能开关管理或数据处理等场景中非常实用,能够帮助开发者创建更灵活和响应式的应用程序…

    2025年12月21日
    000
  • Google表单自动化提交:利用编程实现动态数据填充

    本教程旨在指导读者如何通过编程实现google表单的自动化提交,特别适用于需要批量填充模拟数据或进行数据驱动测试的场景。我们将探讨基于python和selenium库的浏览器自动化方法,详细介绍从数据准备到表单元素交互及提交的完整流程,帮助您高效完成重复性数据录入任务。 引言:自动化Google表单…

    2025年12月21日
    000
  • JS如何实现深拷贝_JavaScript深拷贝与浅拷贝区别及实现方法

    深拷贝与浅拷贝的核心区别在于对引用类型处理方式不同:浅拷贝仅复制对象第一层属性,嵌套对象仍共享引用,修改会相互影响;深拷贝则递归复制所有层级,生成完全独立的新对象。常见浅拷贝方法包括Object.assign、扩展运算符、slice/concat等,但均只复制引用地址;JSON.parse(JSON…

    2025年12月21日
    000
  • 动态网格重绘中的DOM管理与优化实践

    本文旨在解决动态调整css grid布局时,旧网格元素未清除导致布局错乱的问题。通过分析dom操作不当的根本原因,提供了一种在重新生成网格前清空容器内容的有效方法,并优化了事件监听机制,确保etch-a-sketch等交互式应用在尺寸调整时能正确、高效地渲染新网格,从而避免元素堆叠和性能下降。 1.…

    2025年12月21日
    000
  • jQuery中过滤方法slice()方法如何使用?

    jQuery的slice()方法用于筛选指定范围的元素,语法为$(selector).slice(start, end);start为起始索引(从0开始,负数表示从末尾计),end为结束位置(不包含,可选);常用于操作部分DOM元素,如前几项、中间段或最后几项;例如选取前3个div:$(&#8216…

    2025年12月21日
    000
  • 使用CARTO v3和DeckGL动态控制地图图层可见性教程

    本教程详细介绍了如何利用carto v3和deckgl库在javascript中实现地图图层的动态显示与隐藏。核心机制在于通过修改`deckgl`实例的`layers`属性,特别是每个图层对象的`visible`属性,并结合`deckgl.setprops()`方法来实时更新地图视图。文章涵盖了环境…

    2025年12月21日
    000
  • FullCalendar多实例同步:主日历更新后列表日历自动刷新指南

    本文详细介绍了在使用FullCalendar时,如何解决在一个页面中管理多个日历实例并实现数据同步的问题。当主编辑日历更新事件后,旁边的列表视图日历能够自动刷新其事件数据。核心解决方案在于将日历对象声明为全局变量,并在主日历的AJAX数据更新成功回调中,调用列表日历的`refetchEvents()…

    2025年12月21日
    000
  • 使用JavaScript实现一个简单的Web服务器_Node.js

    使用Node.js内置http模块可快速创建Web服务器,通过createServer处理请求响应,监听端口并根据URL实现简单路由,返回文本或HTML内容。 使用Node.js实现一个简单的Web服务器 Node.js 是基于 Chrome V8 引擎的 JavaScript 运行环境,它让 Ja…

    2025年12月21日
    000
  • 使用WebRTC构建点对点视频聊天应用

    答案是掌握WebRTC的信令机制、连接流程和网络穿透。通过SDP协商媒体能力,ICE候选建立点对点连接,利用WebSocket实现信令服务器交换offer/answer,结合STUN/TURN解决NAT穿透,前端处理媒体获取与连接状态,确保低延迟实时通信。 点对点视频聊天应用的核心在于实时音视频传输…

    2025年12月21日
    000
  • JavaScript 数据类型:深入理解原始类型与引用类型

    JavaScript数据类型分原始类型和引用类型,原始类型按值访问、不可变,包括string、number、boolean、null、undefined、symbol、bigint;2. 原始类型赋值时复制值副本,互不影响;3. 引用类型存储对象地址,赋值时复制引用,指向同一对象则修改互相影响;4.…

    2025年12月21日
    000
  • JavaScript数组去重的十种高效方法_javascript技巧

    使用Set去重最简洁高效,适用于基本类型;2. filter+indexOf兼容性好但性能较差;3. forEach+Object利用键值记录,需注意类型转换问题;4. Map方式更安全可靠,支持任意键类型;5. reduce函数式风格清晰但性能一般;6. 排序后比较节省空间但改变顺序;7. JSO…

    2025年12月21日
    000
  • JavaScript与Spring多数据源配置结合的方法

    JavaScript无法直接配置Spring多数据源,但可通过调用不同API触发后端数据源切换。后端通过@DataSource注解和AbstractRoutingDataSource实现动态路由,前端根据业务需求请求对应接口,如读操作调用/report走从库,写操作调用/user走主库。配合CORS…

    2025年12月21日
    000
  • Supabase Edge Function CORS 故障排除指南

    本文旨在解决在 Supabase Edge Function 中遇到的跨域资源共享(CORS)错误,特别是当函数在本地正常运行但在生产环境失败时。文章将详细阐述如何在 Edge Function 中正确配置 CORS 头部,处理预检请求,并强调本地 Supabase Docker 环境与 CLI 同…

    2025年12月21日
    000
  • dc.js barChart 分组与维度:自定义分箱与刷选机制深度解析

    本文深入探讨dc.js中`dc.barChart`的维度(dimension)和分组(group)机制,特别是如何实现自定义数据分箱。我们将对比在维度函数内或分组函数内进行分箱的两种方法,并通过具体代码示例展示其实现。文章还将重点解析刷选(brushing)功能对这两种分箱策略的影响,强调在交互式数…

    2025年12月21日
    000
  • AJAX登录表单成功提交后页面不跳转的解决方案

    本教程旨在解决使用javascript和ajax处理登录表单时,即便数据验证成功,表单也未能按预期跳转的问题。我们将深入分析`event.preventdefault()`和`form.submit()`在ajax成功回调中的常见误区,并提供一套正确的客户端重定向策略,确保用户在成功登录后能够无缝导…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信