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


深拷贝与浅拷贝的核心区别在于对引用类型处理方式不同:浅拷贝仅复制对象第一层属性,嵌套对象仍共享引用,修改会相互影响;深拷贝则递归复制所有层级,生成完全独立的新对象。常见浅拷贝方法包括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)且不含特殊类型的场景。

LALAL.AI LALAL.AI

AI人声去除器和声乐提取工具

LALAL.AI 196 查看详情 LALAL.AI

手写递归实现深拷贝

为了克服 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运营  # 临沂营销企业网站建设  # 黄冈抖音推广网站是什么  # 海外营销推广区别在于  # 这是  # 非标准  # 组中  # 自定义  # js语法教程  # 第一层  # 如何实现  # 的是  # 数据结构  # 递归  # red  # 区别  # 递归函数  # 浏览器  # json  # js  # java  # javascript 


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


相关推荐: 漫蛙漫画官方网站使用_漫蛙manwa网页版在线入口教程  《偃武》甘宁技能详解  sublime text 4如何安装_最新版sublime下载与汉化教程  AO3永久镜像入口开放_AO3最新网址兼容所有浏览器  以下哪一项是古代兵书三十六计中的计谋  抖音官网入口快速访问 抖音网页版账号注册解析  三星M34录音变声问题_Samsung M34麦克风调整  Linux如何自动分析系统异常日志_Linux日志智能检测  解决Go encoding/json 将JSON大数字解析为浮点数的问题  深入理解Python对象引用与链表属性赋值  泰拉瑞亚网页版在线登录入口 泰拉瑞亚官方正版入口  智慧团建活动报名入口 智慧团建活动报名入口手机端官网​  如何测试您的网站全球打开速度-网站海外测速工  win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】  优化响应式标题底部边框:CSS实现技巧与最佳实践  C++ optional用法详解_C++17处理可能为空的返回值  PHP安全加载非公开目录图片与动态内容类型处理指南  小红书如何引流到私信?引流到私信有用吗?  Yandex世界探索 最新官方免登录入口全知道  韩剧圈正版官网入口_韩剧圈官方指定登录  苹果手机怎么合并照片_苹果手机合并多张照片的操作方法  Linux如何开发轻量级数据服务模块_Linux服务化设计  steam缓存文件在哪儿_steam缓存文件的路径查找方法与结构说明  在Dash应用中自定义HTML标题和网站图标  荣耀盒子应用管理技巧  德邦快递查询入口登录官网 德邦快递单号查询系统入口  uc浏览器官网网页版使用 uc浏览器官网免费在线首页  汽水音乐在线入口 汽水音乐网页端官方页面快速打开  《procreate》绘制渐变效果教程  iSpring三分屏制作教程  钉钉任务无法提醒如何处理 钉钉任务提醒优化方法  windows10怎么更改下载路径_windows10默认存储位置修改教程  4399小游戏下装链接 4399小游戏下载链接入口  Win11便笺在哪打开 Win11桌面便笺(Sticky Notes)使用方法【详解】  Win11如何分屏操作_Win11多窗口分屏技巧  国际经济与贸易就业方向解析  多闪电脑版下载_多闪PC端模拟器使用  J*aScript实现下拉菜单驱动的动态表格数据展示  C++如何使用CMake构建项目_C++ CMakeLists.txt编写入门教程  快手极速版在线体验区 快手极速版网页体验入口  J*aScript对象中深度嵌套URL键的查找与更新策略  房产|直播|视频号怎么认证开通?|直播|需要什么资质?  苹果电脑如何快速查看电池状态 苹果电脑电池信息快捷方法  修复UI元素交互障碍:从“开始”按钮到信息框的平滑过渡实现  C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧  PHP中动态类名访问的类实例类型提示与静态分析实践  如何查询个人病历记录  Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南  t3出行如何使用微信支付  百度浏览器无法安装扩展程序_百度浏览器插件安装失败原因解析 

 2025-11-06

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

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

点击免费数据支持

提交您的需求,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.