新闻中心

对象拷贝:深拷贝与浅拷贝实现方案

2025-11-19
浏览次数:
返回列表
浅拷贝只复制对象第一层属性,嵌套对象共享引用,修改会影响原对象;深拷贝递归复制所有层级,生成完全独立副本。常用浅拷贝方法有Object.assign、扩展运算符;深拷贝可用JSON.parse(JSON.stringify())、递归实现或Lodash的cloneDeep。

对象拷贝:深拷贝与浅拷贝实现方案

在J*aScript中,对象拷贝是一个常见需求。根据是否复制对象内部引用的数据,分为浅拷贝深拷贝。理解两者的区别并掌握实现方式,对开发至关重要。

浅拷贝:只复制第一层属性

浅拷贝创建一个新对象,将原对象的可枚举属性复制过来,但如果属性值是引用类型(如对象或数组),则只复制引用地址,不会递归复制其内容。这意味着修改嵌套对象会影响原对象。

常见的浅拷贝方法包括:

  • Object.assign():将多个源对象合并到目标对象
  • 扩展运算符(...):语法简洁,适合日常使用
  • for...in 循环手动赋值:兼容性好,可控性强
示例:
const obj = { a: 1, b: { c: 2 } };
const copy = { ...obj };
copy.b.c = 3;
console.log(obj.b.c); // 输出 3,说明共享引用

深拷贝:完全独立的副本

深拷贝会递归复制对象的所有层级,生成一个与原对象完全独立的新对象。修改拷贝后的对象不会影响原始对象。

Kreado AI Kreado AI

Kreado AI是一个多语言AI视频创作平台,只需输入文本或关键词,即可创作真实/虚拟人物的多语言口播视频。 为创作者提供AI赋能

Kreado AI 182 查看详情 Kreado AI

实现深拷贝有多种方案,各有优劣:

  • JSON.parse(JSON.stringify(obj)):简单快捷,但有明显限制,比如不支持函数、undefined、Symbol、循环引用等
  • 递归实现:手动遍历对象属性,对引用类型继续调用深拷贝函数,能处理大多数情况
  • 结构化克隆算法(Structured Clone):浏览器原生支持,可通过MessageChannel或postMessage实现,比JSON更强大
  • 第三方库(如 Lodash):提供成熟的 _.cloneDeep 方法,兼容性好,功能全面
简易递归深拷贝示例:
function deepClone(obj, seen = new WeakMap()) {
  if (obj === null || typeof obj !== 'object') return obj;
  if (seen.has(obj)) return seen.get(obj); // 处理循环引用

  const clone = Array.isArray(obj) ? [] : {};
  seen.set(obj, clone);

  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      clone[key] = deepClone(obj[key], seen);
    }
  }
  return clone;
}

选择建议

实际开发中应根据场景选择合适方式:

  • 若对象结构简单且不含函数、日期等特殊类型,JSON方法足够用
  • 需要完整支持各种数据类型时,推荐使用Lodash 的 cloneDeep
  • 追求无依赖可使用递归+WeakMap实现,注意处理边界情况
  • 浅拷贝适用于临时扩展对象、避免直接修改原对象的一层属性
基本上就这些。关键在于清楚自己操作的数据结构,避免因共享引用导致意外修改。

以上就是对象拷贝:深拷贝与浅拷贝实现方案的详细内容,更多请关注其它相关文章!


# 是一个  # 广东教育网站推广热线  # 网站建设广告投放  # 安居贷营销推广  # 李沧区品牌网站建设优势  # 莱州全网营销推广公司  # 潍坊网站推广公司有哪些  # 器械企业怎么做网站推广  # 网络营销问答推广的意义  # seo快照更新  # 临沂产品营销推广中心  # 扁平化  # 第一层  # 多语言  # 性好  # 深拷贝  # 运算符  # 数据结构  # 如何实现  # 关键词  # 递归  # red  # 区别  # 浏览器  # json  # js  # java  # javascript  # 浅拷贝 


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


相关推荐: 解决深度学习模型训练初期异常高损失与完美验证准确率问题  汽水音乐在线解析 汽水音乐在线解析入口  葱吃多了会怎样 葱吃多了会伤胃吗  Python字典中优雅地迭代剩余元素的方法  Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  Pandas DataFrame 多条件优先级排序与排名  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  Centos/Linux 系统下安装 composer 的完整步骤  基于动态规划的房屋花卉种植最小成本算法详解  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  css绝对定位元素脱离父容器怎么办_确保父元素position非static  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  Kafka Streams中基于消息头条件过滤消息的实现指南  Golang如何使用net/url解析URL_Golang URL解析与处理方法  C++如何实现异步操作_C++11使用std::future和std::async进行异步编程  理解Python模块与全局变量的作用域管理  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  Go语言中高效处理x-www-form-urlencoded表单数据  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  Lar*el Excel导入时生成自定义递增ID的策略与实践  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  小红书网页版入口链接分享 小红书官网直接进  星露谷物语官网入口 星露谷物语游戏官网入口  Golang如何使用context实现超时取消_Golang context超时取消模式实践  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  QQ网页版官方账号入口 QQ网页版网页版登录指南  Tailwind CSS line-clamp 布局问题解析与修复指南  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法  J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案  Lar*el Form Request中唯一性验证在更新操作中的正确实现  在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用  绝地鸭卫平a核爆刀流玩法攻略  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  整合Supabase认证与Django模型:跨模式迁移的解决方案  J*aScript中在Map循环中检测并处理空数组元素  AO3官网镜像链接 Archive of Our Own同人文在线浏览  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  反效果?《战地6》免费试玩开启后玩家数不升反降  AO3最新官网入口公告_2025AO3镜像站实时查询方法  大象笔记网页版入口 印象笔记网页版登录入口  Eclipse怎么运行工程_Eclipse工程运行配置说明 

搜索