JavaScript中如何深拷贝对象_有哪些实现方法

JavaScript深拷贝核心是创建完全独立的新对象,避免引用共享;常用方法包括JSON.parse(JSON.stringify())(简洁但有类型限制)、structuredClone()(现代标准,支持多类型)、手写递归(可控但复杂)和Lodash的cloneDeep()(全面稳妥)。

javascript中如何深拷贝对象_有哪些实现方法

JavaScript中深拷贝对象,核心是创建一个与原对象完全独立的新对象,新对象的属性值(包括嵌套对象、数组)都不与原对象共享引用。直接赋值或浅拷贝(如Object.assign()、展开运算符{...obj})只复制第一层,深层仍共用内存地址,修改嵌套内容会影响原对象。

使用 JSON.parse(JSON.stringify()) —— 简单但有局限

这是最常用、写法最简洁的方法,适合纯数据对象(只含字符串、数字、布尔值、null、数组、普通对象):

✅ 优点:一行代码搞定,无依赖,兼容性好 ❌ 缺点明显:
  • 会丢失函数、undefined、Symbol、Date、RegExp、Map、Set、BigInt等类型
  • 循环引用会直接报错(TypeError: Converting circular structure to JSON
  • Date 变成字符串,正则变成空对象

示例:

const obj = { a: 1, b: { c: 2 } };
const copy = JSON.parse(JSON.stringify(obj)); // ✅ 深拷贝成功

使用 structuredClone() —— 现代浏览器推荐方案

这是 ES2022 新增的标准 API,专为深拷贝设计,支持更多内置类型且能处理循环引用(部分环境):

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

✅ 支持 Map、Set、Date、RegExp、ArrayBuffer、TypedArray、Error、Blob 等 ✅ 原生、安全、无需第三方库 ⚠️ 注意:
  • 目前不支持函数、undefined、Symbol(同 JSON 方法)
  • 循环引用在 Chrome 98+、Firefox 94+、Safari 15.4+ 支持;旧版本不支持会抛错

示例:

const obj = { date: new Date(), re: /abc/g };
const copy = structuredClone(obj); // ✅ 正确保留日期和正则

手写递归深拷贝 —— 完全可控,适合学习或特殊需求

适用于需要自定义行为(如忽略某些字段、处理函数、兼容老环境)的场景。关键逻辑是判断类型、递归处理对象/数组,其他类型直接返回:

typeofArray.isArray() 区分基本类型、数组、普通对象 用 Object.prototype.toString.call()instanceof 识别 Date、RegExp 等内置对象 需用 WeakMap 记录已拷贝的对象,避免循环引用无限递归

简化版示意(不含循环引用处理):

function deepClone(obj) {
  if (obj === null || typeof obj !== ‘object’) return obj;
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof RegExp) return new RegExp(obj);
  const clone = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      clone[key] = deepClone(obj[key]);
    }
  }
  return clone;
}

借助第三方库 —— 生产环境稳妥选择

Lodash 的 _.cloneDeep() 是最成熟稳定的方案,覆盖几乎所有边界情况:

✅ 支持函数、undefined、循环引用、各种内置对象、不可枚举属性 ✅ 经过大量测试,性能优化良好 ⚠️ 缺点:引入额外依赖,包体积增加(可按需导入)

示例:

import { cloneDeep } from ‘lodash-es’;
const copy = cloneDeep(originalObj);

基本上就这些。日常开发优先考虑 structuredClone()(兼容性满足时),老项目或需极致兼容用 Lodash;JSON 方案仅限简单数据结构;手写适合教学或定制化强的场景。

以上就是JavaScript中如何深拷贝对象_有哪些实现方法的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
c++如何使用Intel VTune Profiler分析热点_c++性能瓶颈定位神器【工具】
上一篇 2026年5月10日 11:20:15
php数据如何使用Composer管理项目依赖_php数据包管理工具Composer入门
下一篇 2026年5月10日 11:20:18

相关推荐

  • JavaScript中为动态列表元素创建唯一悬停描述的教程

    本教程旨在解决如何为动态生成的列表或数组元素分配唯一悬停描述(tooltip)的问题。文章将深入探讨使用javascript对象和map数据结构来高效地管理名称与描述的映射关系,并提供具体的代码示例,以实现每个列表项在鼠标悬停时显示不同的自定义信息,同时兼顾性能与数据顺序的需求。 在网页开发中,我们…

    2026年5月10日
    000
  • Go API 文档利器:godoc 的实践与应用

    `godoc` 是 go 语言官方提供的强大工具,能将符合规范的注释自动转换为专业且易于导航的 api 文档,其风格与 go 官网一致。本文将详细指导如何利用 `godoc` 在本地生成并浏览您的 go 项目文档,解决常见配置问题,助您高效展示代码api。 1. godoc 简介与 Go 注释规范 …

    2026年5月10日
    000
  • Go语言与Microsoft SharePoint集成指南

    Go语言可以有效集成Microsoft SharePoint,主要通过两种途径:一是利用SharePoint提供的RESTful API进行数据交互,Go的标准HTTP客户端库即可轻松实现;二是通过SharePoint应用模型开发自托管应用,这种模型支持使用包括Go在内的任何语言编写后端逻辑。 1.…

    2026年5月10日
    000
  • JavaScript图形可视化与Canvas编程

    Canvas是JavaScript图形可视化核心,通过获取2D上下文实现绘图;可绘制矩形、路径、圆弧并设置样式,结合requestAnimationFrame实现动态柱状图动画。 JavaScript 图形可视化在现代网页开发中扮演着重要角色,尤其适合需要动态展示数据的场景,比如仪表盘、图表、动画和…

    2026年5月10日
    000
  • 如何在Golang中测试goroutine性能_Golang goroutine性能测试方法汇总

    使用基准测试评估goroutine开销,通过pprof监控资源使用,结合工作池控制并发度,并利用trace分析调度行为,全面优化性能。 在Golang中测试goroutine性能,关键在于合理使用基准测试(benchmark)、控制并发规模、避免资源竞争,并借助工具分析程序行为。下面介绍几种常用且有…

    2026年5月10日
    100
  • javascript生命周期钩子是什么_组件有哪些关键阶段?

    JavaScript原生无生命周期钩子,这是Vue、React等框架为组件设计的机制;Vue按创建、挂载、更新、卸载四阶段提供对应钩子,React类组件有明确生命周期方法,函数组件则通过useEffect模拟,其核心价值在于精准控制执行时机以避免DOM操作错误和内存泄漏。 JavaScript 本身…

    2026年5月10日
    000
  • HTML Canvas动画残影消除:实现动态元素无痕移动

    本文旨在解决HTML Canvas动画中元素移动时产生的残影问题。通过在每个动画帧开始时清空并重绘Canvas背景,可以有效消除元素留下的“轨迹”,实现平滑、无痕的动态效果。文章将详细介绍背景重绘的实现方法,并提供代码示例,同时探讨如何利用半透明背景创建渐隐残影的进阶技巧。 理解Canvas动画中的…

    2026年5月10日
    000
  • 解决PHP foreach循环中变量“继承”问题:理解与避免意外数据泄露

    本文探讨PHP foreach循环中一个常见的陷阱:当循环内部的数组或变量未被显式初始化时,其值可能会“继承”自上一次循环迭代,导致意外的数据泄露和逻辑错误。文章将深入分析这一现象的根源,并通过示例代码展示如何通过在每次迭代开始时正确初始化变量来解决此问题,确保代码行为的预期一致性。 引言:fore…

    2026年5月10日
    100
  • 怎么在eclipse中运行html_eclipse运行html步骤【指南】

    1、可通过Eclipse内置Web浏览器预览HTML文件,需右键文件选择“Open With”→“Web Browser”,前提是安装了Web Developer Tools插件;2、若无内置浏览器支持,可右键文件选择“Show In”→“System Editor”后在资源管理器中用Chrome或…

    2026年5月10日
    000
  • HTML/CSS中链接与按钮的正确嵌套:避免文本超链接化与结构优化指南

    本教程旨在解决HTML中链接()与按钮(button)或类按钮元素嵌套不当导致非预期文本超链接化的问题。我们将通过修正标签的错误闭合,并推荐使用 等语义化元素作为链接内容并应用按钮样式,来创建功能正确、结构清晰且包含文本或图像的交互式按钮,从而提升页面的可维护性和用户体验。 在网页开发中,我们经常需…

    2026年5月10日
    000
  • 如何安全有效地从外部网页获取HTML元素数据并应用于自身页面

    本教程旨在解决如何在不同域名下,通过javascript获取并使用另一个网页的html元素数据。文章将深入探讨同源策略的限制,并提供两种主要解决方案:使用` 在现代Web开发中,有时我们需要从外部网站获取特定的HTML内容或属性值,并将其整合到我们自己的网页中。例如,从XYZ.COM/B.html页…

    2026年5月10日
    000
  • 如何用Golang构建无状态微服务 分享Session管理最佳实践

    如何用Golang构建无状态微服务 分享Session管理最佳实践如何用Golang构建无状态微服务 分享Session管理最佳实践如何用Golang构建无状态微服务 分享Session管理最佳实践如何用Golang构建无状态微服务 分享Session管理最佳实践

    构建无状态微服务时,session管理可通过jwt、redis和统一认证中心实现。①使用jwt作为token,客户端存储,服务端无状态;②结合redis记录session元数据,支持主动失效;③设立统一认证中心,中间件校验token;④确保https传输安全并设计token刷新机制。 用 Golan…

    2026年5月10日 用户投稿
    000
  • 使用SMTP.js发送邮件:客户端集成、常见问题与最佳实践指南

    本文深入探讨了使用SMTP.js库在前端发送邮件时可能遇到的问题,特别是与Elastic Email集成时的挑战。我们将分析代码中常见的异步处理错误、条件函数定义陷阱,并提供修正后的代码示例和最佳实践。重点强调了正确处理Promise链、确保函数可访问性以及客户端邮件发送的安全考量,帮助开发者构建更…

    2026年5月10日
    000
  • HTML结构错误解析与W3C验证器指南

    本文旨在深入解析常见的html结构错误,特别是涉及` `、“和` `元素的不当使用,这些错误常导致w3c验证器报错。我们将详细阐述这些元素的正确语义和放置规则,解释隐式闭合机制如何引发验证问题,并通过实际代码示例展示如何构建符合标准、易于维护的html文档,从而提升网页的兼容性和可访问性…

    2026年5月10日
    000
  • php源码怎么运行手机_php源码手机运行环境搭建步骤【教程】

    可在手机上通过特定工具运行PHP源码。首先选择支持PHP的移动应用,安卓用户可安装UserLAnd或KSWEB,iOS用户可尝试iSH Shell或a-Shell;然后配置本地服务器环境,启动HTTP和PHP服务,将PHP文件放入指定根目录;接着可通过Termux搭建完整开发环境,更新包列表并安装P…

    2026年5月10日
    000
  • 怎么安装html5_HTML5开发环境安装与配置详细步骤

    答案是配置HTML5开发环境需三步:1. 安装VS Code等编辑器并配置插件;2. 使用Chrome或Firefox测试页面;3. 可选搭建本地服务器,如Live Server或http-server;最后创建index.html文件验证环境。 安装HTML5开发环境其实并不复杂,因为HTML5本…

    2026年5月10日
    000
  • JavaScript动态下拉菜单:实现日期选项与价格计算关联

    在现代web应用中,动态生成表单元素并使其具备交互逻辑是常见的需求。特别是在需要根据用户选择调整价格或服务参数的场景下,下拉菜单()常被用来展示一系列选项。本教程将指导您如何利用javascript动态生成一个包含日期选项的下拉菜单,并为每个选项关联一个具体的数值(如剩余天数),进而实现一个基于用户…

    2026年5月10日
    000
  • JavaScript中逻辑AND运算符的语法陷阱解析

    本文深入探讨了javascript中逻辑and (`&&`) 运算符在特定场景下引发语法错误的原因。通过对比 `1 && {}` 和 `{} && 1` 两种表达式,揭示了javascript解析器对对象字面量 `{}` 的不同解释机制,特别是当 `{…

    2026年5月10日
    000
  • BOM中如何获取和修改文档的标题?

    BOM中如何获取和修改文档的标题?BOM中如何获取和修改文档的标题?BOM中如何获取和修改文档的标题?BOM中如何获取和修改文档的标题?

    要获取和修改文档标题,可通过document.title属性操作。获取方式为const currenttitle = document.title; 修改则直接赋值新字符串。应用场景包括单页应用导航更新、实时状态提示、a/b测试及监控页面指标展示。技术挑战涉及与浏览器历史同步、seo优化配合、避免频…

    2026年5月10日 用户投稿
    000
  • 使用JavaScript正则表达式验证DFA字符串

    本文旨在探讨如何高效地使用javascript的内置正则表达式功能来验证符合特定确定性有限自动机(dfa)规则的字符串。我们将对比手动构建状态转换表的复杂性与利用正则表达式的简洁与强大,并通过具体代码示例展示如何将dfa的正则表达式直接应用于字符串验证,从而实现更可靠、易维护的解决方案。 确定性有限…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信