什么是TS中的浅副本和深拷贝

什么是ts中的浅副本和深拷贝

深拷贝与浅拷贝详解

JavaScript 中复制对象或数组时,可以选择进行浅拷贝或深拷贝。理解两者差异至关重要,尤其在处理复杂数据结构时。

内存与引用机制

JavaScript 对象和数组是引用类型。将它们赋值给变量时,实际赋值的是内存地址,而非数据本身。

原始类型 (例如:字符串、数字、布尔值) 按值存储。引用类型 (例如:对象、数组、函数) 按引用存储。

浅拷贝

浅拷贝仅复制顶层属性,但会引用任何嵌套的对象或数组。修改副本中的嵌套对象会影响原始对象。

工作原理: 浅拷贝只复制对象/数组的第一层级,嵌套的对象/数组共享相同的引用。

潜在问题: 修改副本中的嵌套对象会同时修改原始对象,因为它们指向同一内存地址。

示例:

数组的浅拷贝:

const arr = [1, 2, [3, 4]];const shallowCopy = arr.slice(); // 或 [...arr]shallowCopy[0] = 100;console.log(arr); // [1, 2, [3, 4]]  顶层元素不受影响shallowCopy[2][0] = 999;console.log(arr); // [1, 2, [999, 4]] 嵌套数组被修改

对象的浅拷贝:

const obj = { a: 1, b: { c: 2 } };const shallowCopy = { ...obj };shallowCopy.a = 100;console.log(obj); // { a: 1, b: { c: 2 } } 顶层属性不受影响shallowCopy.b.c = 999;console.log(obj); // { a: 1, b: { c: 999 } } 嵌套对象被修改

要点: 顶层属性按值复制,嵌套结构按引用复制。

浅拷贝方法:

数组: Array.prototype.slice(),展开运算符 ([...arr])对象: Object.assign(),展开运算符 ({...obj})

深拷贝

深拷贝创建原始结构的完全独立副本,包括所有嵌套级别。

工作原理: 递归复制对象或数组的所有层级,嵌套的对象/数组获得独立的副本。

优势: 修改副本不会影响原始对象。

示例:

使用 structuredClone() 进行深拷贝:

const arr = [1, 2, [3, 4]];const deepCopy = structuredClone(arr);deepCopy[2][0] = 999;console.log(arr); // [1, 2, [3, 4]] 原数组保持不变console.log(deepCopy); // [1, 2, [999, 4]]

使用 JSON.parse(JSON.stringify()) 进行深拷贝 (存在限制):

const obj = { a: 1, b: { c: 2 } };const deepCopy = JSON.parse(JSON.stringify(obj));deepCopy.b.c = 999;console.log(obj); // { a: 1, b: { c: 2 } } 原对象保持不变console.log(deepCopy); // { a: 1, b: { c: 999 } }

JSON.parse(JSON.stringify()) 的限制: 无法处理函数、undefined 值、日期、正则表达式、MapSetBigIntSymbol

总结:

特性 浅拷贝 深拷贝

复制深度仅第一层所有嵌套层嵌套修改影响影响原始对象不影响原始对象性能对小型对象更快由于递归,较慢复杂性简单,使用原生方法复杂,可能需要递归方法slice, ..., Object.assign, ...structuredClone(), JSON.parse(JSON.stringify()) (有局限性)

何时使用何种拷贝方式?

浅拷贝: 复制简单对象,没有嵌套结构,或者性能比完整的数据复制更重要时。深拷贝: 复制复杂嵌套对象,需要确保副本与原始对象完全独立时。 推荐使用 structuredClone(),因为它避免了 JSON.parse(JSON.stringify()) 的许多限制。

深拷贝与浅拷贝的机制:

浅拷贝: 创建一个新的对象/数组,原始值按值复制,对象/数组按引用复制。

深拷贝: 递归遍历每个属性,原始值按值复制,对象/数组通过创建新实例进行复制。

性能考量: 深拷贝由于递归遍历嵌套结构,比浅拷贝更耗时和资源。

基准测试: (示例代码略,可自行测试不同方法的性能差异)

结论: 浅拷贝简单快捷,但存在潜在风险;深拷贝安全可靠,但更耗资源。 对于现代应用,建议优先使用 structuredClone() 进行深拷贝。

以上就是什么是TS中的浅副本和深拷贝的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 23:42:20
下一篇 2025年12月19日 23:42:39

相关推荐

  • Discord.js 按钮收集器管理:避免“未知交互”错误

    本文旨在解决Discord.js机器人开发中常见的“未知交互”错误(10062),尤其是在处理多个按钮收集器和交互组件时。我们将深入探讨错误产生的原因,并提供一套系统的解决方案,包括确保交互及时响应、有效管理活跃的按钮面板收集器,以及利用hasRun标志实现单次触发的收集器,从而提升机器人交互的稳定…

    2025年12月20日
    000
  • 什么是JS的静态块?

    静态块是ES2022引入的类级别初始化机制,用于在类加载时执行一次性逻辑。它能初始化复杂静态属性、注册类到全局系统、配置私有静态成员,且可访问类私有静态成员和使用this指向类本身。相比静态属性,它支持复杂逻辑;相比构造函数,它不依赖实例创建;相比IIFE,它更内聚且具访问权限。应用场景包括插件注册…

    2025年12月20日
    000
  • Discord.js 交互收集器的高效管理与“未知交互”错误规避

    本教程深入探讨了在Discord.js机器人开发中,如何有效管理消息组件收集器(MessageComponentCollector)以避免常见的“未知交互”错误。文章将介绍通过局部变量确保单次交互处理,以及通过全局机制停止旧收集器来解决并发交互问题,并提供详细的代码示例和最佳实践,帮助开发者构建稳定…

    2025年12月20日
    000
  • Node.js中如何操作进程信号?

    Node.js中常见进程信号包括SIGINT(用户中断,如Ctrl+C)、SIGTERM(请求终止,用于优雅停机)、SIGHUP(重新加载配置)、SIGUSR1/SIGUSR2(自定义用途)、SIGKILL(强制终止,不可捕获)和SIGSTOP(暂停进程,不可捕获)。其中,SIGINT和SIGTER…

    2025年12月20日
    000
  • Node.js中如何创建子进程?

    Node.js子进程创建方式有四种:spawn用于流式处理和长时间运行任务;exec通过shell执行简单命令并缓冲输出;execFile直接执行可执行文件更安全高效;fork专用于Node.js进程间通信,支持IPC消息传递。 在Node.js中创建子进程,核心在于利用内置的 child_proc…

    2025年12月20日
    000
  • 如何调试缓存相关问题?

    网站显示旧内容通常源于缓存层级中的数据未及时更新,需从浏览器、CDN到服务器端逐层排查。首先通过浏览器开发者工具检查网络请求的Cache-Control、ETag等响应头,确认前端缓存行为;若问题普遍存在,则检查CDN配置及刷新策略;若仅个别用户受影响,可能是本地浏览器缓存导致,可尝试硬性重新加载。…

    2025年12月20日
    000
  • JavaScript split() 方法详解:精准分割字符串并处理特殊情况

    本文详细阐述JavaScript中split()方法的使用,重点讲解如何通过指定包含空格的复合分隔符(如” – “)来精准分割字符串。通过实例演示,读者将学会如何避免内部包含分隔符的子字符串被错误拆分,从而高效地将复杂字符串分解为所需数组,确保数据处理的准确性。 …

    2025年12月20日
    000
  • 怎样使用Node.js操作集合?

    答案:Node.js通过数据库驱动实现集合的增删改查,需选择合适数据库及驱动,使用异步方式处理操作与错误,并通过索引、批量操作、投影、分页、连接池等手段优化性能。 Node.js操作集合,本质上就是利用Node.js的强大能力与数据库进行交互,实现对数据的增删改查等操作。关键在于选择合适的数据库驱动…

    2025年12月20日
    000
  • 怎样使用Node.js操作会话?

    Node.js操作会话需通过中间件如express-session管理用户状态,结合cookie识别用户。首先安装并配置express-session,设置secret密钥、resave和saveUninitialized选项,并根据环境决定cookie.secure属性。会话数据默认存于内存,生产…

    2025年12月20日
    000
  • Node.js集群模式如何配置?

    Node.js集群模式通过cluster模块创建主进程并派生多个工作进程,利用多核CPU提升性能;默认采用轮询负载均衡,可改用基于IP的会话保持策略;进程间状态共享需借助Redis等外部存储或通过master转发消息;支持滚动重启实现优雅停机,避免请求中断。 Node.js集群模式,简单来说,就是利…

    2025年12月20日
    000
  • JavaScript操作CSS样式的常见问题及解决方案

    JavaScript操作CSS样式时遇到的常见问题,特别是内联样式和内部/外部样式表现不一致的情况。文章将深入探讨element.style的特性,并提供使用类名切换和getComputedStyle获取计算样式的替代方案,最后介绍更语义化的HTML5标签ails>。 在Web开发中,经常需要…

    2025年12月20日
    000
  • JavaScript数独校验器:深入解析与优化数字唯一性检测

    本文旨在解决JavaScript数独校验器中常见的逻辑错误,特别是关于数字唯一性检测的实现问题。通过分析原始includes1To9函数仅检查相邻重复项的缺陷,我们将介绍如何利用JavaScript Set数据结构高效且准确地判断数组中是否存在重复数字,从而确保数独行、列及3×3宫格的有效…

    2025年12月20日
    000
  • 深入理解JavaScript正则表达式v标志与HTML pattern属性

    本文深入探讨了在使用HTML pattern属性时,正则表达式因自动启用v标志而导致SyntaxError的问题。v标志对字符类中的特殊字符(如连字符-)有更严格的解析规则,要求将其转义。文章详细解释了v标志与u标志的区别,HTML pattern的工作机制,并提供了正确的正则表达式写法,以避免常见…

    2025年12月20日
    000
  • JavaScript 实现倒计时字体颜色动态变化

    本文介绍了如何使用 JavaScript 创建一个倒计时定时器,并在特定时间点(例如倒计时到 0:59 时)动态改变字体颜色。通过修改 Timeout 函数,添加条件判断语句,可以轻松实现这一功能,从而提升用户体验。 实现倒计时字体颜色动态变化 以下是如何使用 JavaScript 实现倒计时并在特…

    2025年12月20日
    000
  • JavaScript实现倒计时字体颜色变化

    本文将介绍如何使用 JavaScript 实现一个倒计时器,并在特定时间点(例如倒计时到 0:59)将字体颜色更改为红色。我们将提供完整的 JavaScript 代码示例,并解释如何在现有代码中添加颜色变化功能,使您能够轻松地将此功能集成到您的项目中。 实现倒计时字体颜色变化 以下代码展示了如何实现…

    2025年12月20日
    000
  • JavaScript实时计时器:实现特定时间点字体颜色动态变化

    本教程详细指导如何使用JavaScript创建一个实时倒计时器,并实现在特定时间点(例如倒计时至0:59时)动态改变计时器字体颜色的功能。通过在计时函数中添加条件判断,精确控制样式变化,提升用户体验。 1. 构建基础实时倒计时器 首先,我们需要一个html元素来显示计时器,以及一段javascrip…

    2025年12月20日
    000
  • 使用 JavaScript 动态改变字体颜色

    本文详细介绍了如何使用 JavaScript 在倒计时器达到特定时间时动态改变字体颜色。通过在计时器函数中添加条件判断,可以在特定时间点修改元素的样式,实现视觉上的提醒效果。本文提供完整的代码示例,并解释了关键步骤,帮助开发者轻松实现这一功能。 实现动态字体颜色改变 在网页开发中,经常需要根据特定条…

    2025年12月20日
    000
  • JavaScript实时计时器字体颜色动态改变教程

    本教程详细介绍了如何使用JavaScript创建一个实时倒计时器,并在特定时间点(例如倒计时至59秒时)动态改变计时器文本的字体颜色。文章通过具体代码示例,演示了如何利用条件判断和DOM操作,在不中断现有计时逻辑的前提下,实现页面元素的样式动态更新,提升用户体验。 构建基础实时倒计时器 在web开发…

    2025年12月20日
    000
  • 使用 JSON.stringify 创建格式化的 CSS 块

    本文介绍了如何利用 JSON.stringify 方法格式化输出 CSS 样式块,并提供了一个简单的示例。虽然 JSON.stringify 主要用于处理 JSON 数据,但通过一些技巧,我们可以利用其格式化功能,生成具有良好缩进和可读性的 CSS 样式字符串。本文将详细讲解如何使用 JSON.st…

    2025年12月20日
    000
  • 使用 JSON.stringify 创建格式化的 CSS 代码块

    在 JavaScript 开发中,我们经常需要将数据转换为字符串格式,以便于存储或传输。JSON.stringify 方法可以将 JavaScript 对象转换为 JSON 字符串,并且可以通过设置参数来实现格式化输出。本文将重点介绍如何利用 JSON.stringify 方法创建格式化的 CSS …

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信