新闻中心

JS如何实现深拷贝_J*aScript深拷贝与浅拷贝区别及实现方法

2025-11-06
浏览次数:
返回列表
深拷贝与浅拷贝的核心区别在于对引用类型处理方式不同:浅拷贝仅复制对象第一层属性,嵌套对象仍共享引用,修改会相互影响;深拷贝则递归复制所有层级,生成完全独立的新对象。常见浅拷贝方法包括Object.assign、扩展运算符、slice/concat等,但均只复制引用地址;JSON.parse(JSON.stringify(obj))可实现深拷贝,但无法处理函数、undefined、Symbol、循环引用及Date类型;手写递归深拷贝通过WeakMap解决循环引用问题,支持Date、RegExp等特殊类型,兼容性好;structuredClone为现代浏览器提供的原生深拷贝API,功能强大且支持复杂类型和循环引用,但兼容性有限。实际应用中需根据数据结构复杂度、特殊类型存在与否及浏览器兼容需求选择合适方案,手写递归通常是最稳妥选择。

js如何实现深拷贝_javascript深拷贝与浅拷贝区别及实现方法

J*aScript中的深拷贝和浅拷贝主要区别在于对引用类型数据的处理方式。当你复制一个对象时,如果该对象包含嵌套的对象或数组,浅拷贝只会复制第一层属性,而更深层的引用仍然指向原对象;深拷贝则会递归复制所有层级,生成一个完全独立的新对象。

浅拷贝 vs 深拷贝的区别

浅拷贝:只复制对象的第一层属性。对于基本类型值,复制的是值本身;对于引用类型(如对象、数组),复制的是引用地址,因此新旧对象共享嵌套结构,修改会影响彼此。

深拷贝:递归复制对象的所有层级,包括嵌套的对象和数组,生成一个全新的、与原对象无任何关联的独立副本。修改新对象不会影响原对象。

常见浅拷贝方法:
  • Object.assign({}, obj)
  • {...obj}
  • Array.prototype.slice() / concat()
注意:这些方法都只能实现浅拷贝。

JSON.stringify + JSON.parse 实现深拷贝

这是最简单的深拷贝方法之一:

const deepCopy = JSON.parse(JSON.stringify(originalObj));

优点:语法简单,能处理大多数普通对象和数组的深拷贝。

缺点:有明显局限性:

  • 无法处理函数、undefined、Symbol等非可序列化类型
  • 会忽略 Symbol 属性键
  • 不能处理循环引用(会报错)
  • Date 对象会被转为字符串

因此,仅适用于纯数据对象(POJO)且不含特殊类型的场景。

BrandCrowd BrandCrowd

一个在线Logo免费设计生成器

BrandCrowd 200 查看详情 BrandCrowd

手写递归实现深拷贝

为了克服 JSON 方法的限制,可以手动编写递归函数实现更完整的深拷贝:

function deepClone(obj, hash = new WeakMap()) {<br>
  if (obj == null) return obj;<br>
  if (typeof obj !== 'object') return obj;<br>
  if (obj instanceof Date) return new Date(obj);<br>
  if (obj instanceof RegExp) return new RegExp(obj);<br>
  // 防止循环引用<br>
  if (hash.has(obj)) return hash.get(obj);<br>
  // 保留构造函数信息<br>
  const clone = new obj.constructor();<br>
  hash.set(obj, clone);<br>
  for (let key in obj) {<br>
    if (obj.hasOwnProperty(key)) {<br>
      clone[key] = deepClone(obj[key], hash);<br>
    }<br>
  }<br>
  return clone;<br>
}

这个版本支持 Date、RegExp,并使用 WeakMap 解决循环引用问题,兼容性较好。

使用 structuredClone(现代浏览器)

现代浏览器提供了原生的深拷贝 API:

const deepCopy = structuredClone(originalObj);

它支持很多复杂类型,包括 transferable objects,也支持循环引用。但兼容性有限(Chrome 98+ 等较新版本支持),不适合需要兼容老浏览器的项目。

基本上就这些常见的实现方式。选择哪种方法取决于你的具体需求:数据结构是否复杂、是否包含特殊类型、是否需要兼容老浏览器等。多数情况下,手写递归加 WeakMap 是比较稳妥的选择。

以上就是JS如何实现深拷贝_J*aScript深拷贝与浅拷贝区别及实现方法的详细内容,更多请关注其它相关文章!


# 第一层  # 怎么提高网站内链建设  # 东港网站运营推广  # 黄冈网站建设教程  # 塘厦seo优化推广公司  # 眉山seo网络推广营销  # 美业推广营销方案设计  # 足球直播网站建设  # 微信营销线上推广app  # 优化营销推广平台方案  # 石家庄井陉网站建设费用  # 移除  # 图中  # 数据处理  # 运算符  # js语法教程  # 多个  # 如何实现  # 的是  # 数据结构  # 递归  # red  # 区别  # 递归函数  # 浏览器  # json  # js  # java  # javascript 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相  qq游戏跨平台入口_qq游戏多设备同步登录  千牛数据看板网页版_千牛数据看板网页版访问方法  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  qq游戏免费畅玩入口_qq游戏电脑版快速启动  Pyrogram与g4f集成:异步编程实践与常见错误解决  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  css滚动动画效果怎么实现_使用Animate.css滚动触发动画类  Mac怎么使用表情符号_Mac Emoji快捷键面板  谷歌google账号怎么注册账号 谷歌账号注册官方流程  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  Mac怎么查看崩溃日志_Mac控制台错误报告分析  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】  网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  Python中高效访问嵌套字典与列表中的键值对  PHP中高效并行检查多链接状态的教程  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  微博网页版官方账号登录 微博网页版内容浏览使用指南  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  解决Bootstrap卡片顶部边距导致背景图下移的问题  MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  如何使用纯J*aScript判断Input元素是否在特定类容器内  Lar*el Form Request中唯一性验证在更新操作中的正确实现  b站怎么删除评论_b站评论管理与删除操作  QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口  R星幕后开发视频泄露 包含《GTA6》等多款大作  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】  Python多线程中正确使用sigwait处理SIGALRM信号  PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比  照顾宝贝2小游戏免费秒玩入口  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南  漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址  2026年CSGO开箱网站推荐 CSGO开箱平台精选  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  《GTA6》开发画面疑似泄露!这次可不是AI了  手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析  Mac终端命令大全_Mac常用Terminal指令速查 

搜索