J*aScript实现深拷贝的几种方案对比_js编程实践


深拷贝需根据场景选择方法:JSON方法简洁但不支持函数、循环引用等;手动递归可定制但复杂;结构化克隆支持多数内置对象但异步;Lodash最稳定但增加依赖。

javascript实现深拷贝的几种方案对比_js编程实践

深拷贝在J*aScript中是一个常见但容易出错的操作。它指的是创建一个新对象,其属性和嵌套对象的值都与原对象完全独立。修改新对象不会影响原始对象。实现深拷贝有多种方式,每种都有其适用场景和局限性。下面介绍几种主流方法,并进行对比分析。

1. JSON.parse(JSON.stringify())

这是最简单、最常用的深拷贝方法之一。

优点:
  • 语法简洁,一行代码即可完成。
  • 能处理常见的数据类型:对象、数组、字符串、数字、布尔值等。
缺点:
  • 无法处理函数、undefined、Symbol,这些值会被忽略。
  • 不能复制循环引用,会报错。
  • Date对象会被转换为字符串。
  • Map、Set、RegExp等特殊对象无法正确复制。
  • 原型链上的属性不会被保留。

适合场景:仅用于纯数据对象(POJO),且不包含复杂类型或循环引用的情况。

2. 手动递归实现深拷贝

通过递归遍历对象属性,逐层复制。

示例代码:
function deepClone(obj, seen = new WeakMap()) {
  if (obj === null || typeof obj !== 'object') return obj;
  if (seen.has(obj)) return seen.get(obj); // 处理循环引用
<p>let clone;
if (obj instanceof Date) {
clone = new Date(obj);
} else if (obj instanceof RegExp) {
clone = new RegExp(obj);
} else if (Array.isArray(obj)) {
clone = obj.map(item => deepClone(item, seen));
} else {
clone = {};
seen.set(obj, clone);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key], seen);
}
}
}
return clone;
}</p>
优点:
  • 可自定义处理各种数据类型。
  • 支持循环引用(使用WeakMap)。
  • 灵活性高,可根据需求扩展。
缺点:
  • 代码量较大,需要考虑多种边界情况。
  • 手动维护类型判断逻辑,容易遗漏。

适合场景:需要精确控制拷贝行为,或处理复杂对象结构时。

3. 使用结构化克隆算法(Structured Clone)

HTML5提供的结构化克隆算法可用于深拷贝,可通过MessageChannel或postMessage间接使用。

示例:
function structuredClone(obj) {
  return new Promise(resolve => {
    const { port1, port2 } = new MessageChannel();
    port2.onmessage = e => resolve(e.data);
    port1.postMessage(obj);
  });
}
// 注意:需异步调用
structuredClone(obj).then(clone => { /* 使用clone */ });
优点:
  • 浏览器原生支持,性能较好。
  • 支持多数内置对象(Date、RegExp、Map、Set、Blob等)。
  • 自动处理循环引用。
缺点:
  • 不支持函数和undefined。
  • 必须异步调用,使用不便。
  • 某些类型仍受限(如Error对象、DOM节点)。

适合场景:在现代浏览器中处理复杂数据结构,且可以接受异步操作。

度加剪辑 度加剪辑

度加剪辑(原度咔剪辑),百度旗下AI创作工具

度加剪辑 359 查看详情 度加剪辑

4. 利用第三方库(如 Lodash)

Lodash 提供了 _.cloneDeep 方法,功能完善且经过充分测试。

示例:
const _ = require('lodash');
const cloned = _.cloneDeep(obj);
优点:
  • 稳定可靠,覆盖大多数边缘情况。
  • 支持大量J*aScript类型(包括Map、Set、Date、RegExp等)。
  • 处理循环引用无压力。
缺点:
  • 引入额外依赖,增加包体积。
  • 对于简单项目可能“杀鸡用牛刀”。

适合场景:项目已使用Lodash,或对深拷贝稳定性要求极高。

总结对比

不同方案各有侧重:

  • JSON方法最轻便,但限制多,仅适用于简单数据。
  • 手动递归灵活可控,适合定制化需求。
  • 结构化克隆接近原生,但异步使用略麻烦。
  • Lodash等库最稳健,推荐在生产环境使用。

选择哪种方式,取决于你的具体需求:是否涉及复杂类型、是否有循环引用、是否允许异步、是否已有工具库等。

基本上就这些。理解每种方法的边界,才能在实际开发中做出合理选择。

以上就是J*aScript实现深拷贝的几种方案对比_js编程实践的详细内容,更多请关注其它相关文章!


# 文件上传  # 免费b站推广网站哪些  # 美食网站建设分析图  # 沧州东光网站页面优化  # 正规的网站优化电话  # 笋岗各大网站优化  # 杭州新网站建设大概收费  # 江西老牌网站建设企业  # 政协网站法治建设板块  # 专业的网站优化团队  # seo关键词排名都选24火星软件  # 已有  # 都有  # 这是  # 是一个  # javascript  # 如何用  # 结构化  # 几种  # 数据结构  # 递归  # red  # 工具  # 浏览器  # html5  # json  # js  # html  # java 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: VB表达式书写规则解析  win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】  Go语言反射机制下访问嵌入结构体中的被遮蔽方法  在J*a里什么是行为抽象_抽象行为对代码复用的提升作用  4399小游戏下装链接 4399小游戏下载链接入口  创客贴登录页面入口 创客贴网页版最新网址链接  外媒评《燕云十六声》DIY载具新玩法:很像《塞尔达传说王国之泪》!  哔哩哔哩的|直播|间怎么送礼物_哔哩哔哩|直播|送礼操作指南  2025考研成绩查询时间入口分享  《糖豆》添加舞曲方法  iPhone16Plus参数配置如何调整声音_iPhone16Plus参数配置声音调整详细方法  b站网页版入口 哔哩哔哩官方网站直接进入  sublime text 4如何安装_最新版sublime下载与汉化教程  房产|直播|视频号怎么认证开通?|直播|需要什么资质?  掌握产品代码正则表达式:避免常见陷阱与精确匹配  食品生产用水只要符合国家规定的生活饮用水卫生标准就可以吗  快手网页版官方访问 快手网页版页面在线打开  汽水音乐在线听歌网页版 汽水音乐在线听歌网页版入口  Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型  作业帮网页版不用下载入口 在线问老师快速答疑  纯CSS实现自适应宽度与响应式布局的水平按钮组  《王者荣耀世界》英雄获取攻略  天天漫画2025最新入口 天天漫画永久有效登录入口  智慧职教mooc平台登录网址 智慧职教mooc官网直达  Teambition网盘如何共享文件  苹果电脑如何快速查看电池状态 苹果电脑电池信息快捷方法  火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】  J*aScript模拟悬停与点击:自动化网页动态元素交互指南  淘口令快速解析技巧  Win10如何彻底关闭OneDrive Win10禁用云同步功能【纯净】  J*a列表元素格式化输出教程  TikTok收藏夹无法删除视频如何解决 TikTok收藏管理优化方法  在Django中动态检查模型关联:一种灵活的解决方案  J*aScript与CSS动画:实现平滑顺序淡入淡出效果并解决显示冲突  小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】  mysql中如何配置字符集和排序规则_mysql字符集排序配置  解决CSS容器溢出问题:使用calc()实现精确布局与边距控制  iSpring三分屏制作教程  如何用Golang优化微服务间请求性能_Golang 微服务请求性能优化方法  德邦快递收费标准详解  如何定制PrimeNG Sidebar的背景颜色  《合金装备4》有望推出重制版!制作人发话了  优化Flask模板中SQLAlchemy查询迭代标签:处理字符串空格问题  iPhone14开启Apple TV遥控设置  铁路12306官网登录入口 铁路12306在线购票官方平台  微信网页版在线登录 微信网页版在线使用入口  口腔诊所管理软件推荐  顺丰快递单号查询寄件人 顺丰寄件人查询入口  知乎APP怎么查看自己被邀请的问题_知乎APP邀请回答记录查看与参与方法  firefox火狐浏览器最新官网主页_ firefox火狐浏览器平台入口直达官方链接 

 2025-11-16

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.