信息发布→ 登录 注册 退出

对象合并与拷贝方法_浅拷贝与深拷贝实现

发布时间:2025-11-14

点击量:
答案是浅拷贝仅复制对象第一层属性,深拷贝递归复制所有层级。常用浅拷贝方法有Object.assign()和扩展运算符;深拷贝可使用JSON.parse(JSON.stringify())或递归实现,以避免引用共享导致的数据污染。

对象合并与拷贝方法_浅拷贝与深拷贝实现

在J*aScript中,对象的合并与拷贝是开发中常见的操作。由于对象是引用类型,直接赋值只会复制引用,修改新对象会影响原对象。因此需要通过浅拷贝或深拷贝来实现数据隔离。

浅拷贝实现方式

浅拷贝只复制对象的第一层属性,如果属性值是对象,则复制的是引用。

常用方法包括:
  • Object.assign():将多个源对象的可枚举属性复制到目标对象
  • 扩展运算符(...):语法简洁,适合单层对象合并
  • Array.prototype.slice():适用于数组的浅拷贝

示例:

const obj1 = { a: 1, b: { c: 2 } };
const obj2 = Object.assign({}, obj1);
// 或 const obj2 = { ...obj1 };

obj2.b.c = 3;
console.log(obj1.b.c); // 输出 3,说明内部对象被共享

深拷贝实现方式

深拷贝会递归复制对象的所有层级,完全断开引用关系。

常见实现方法:
  • JSON.parse(JSON.stringify()):简单有效,但有局限性(如无法处理函数、undefined、循环引用等)
  • 递归遍历实现:手动判断类型并递归复制,灵活性高
  • 使用第三方库(如 Lodash):提供成熟的 _.cloneDeep() 方法

基础递归深拷贝实现:

Visla Visla

AI视频生成器,快速轻松地将您的想法转化为视觉上令人惊叹的视频。

Visla 100 查看详情 Visla
function deepClone(obj, visited = new WeakMap()) {
  if (obj === null || typeof obj !== 'object') return obj;
  if (visited.has(obj)) return visited.get(obj); // 处理循环引用

  let clone;
  if (Array.isArray(obj)) {
    clone = [];
  } else {
    clone = {};
  }

  visited.set(obj, clone);

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

对象合并操作

对象合并常用于配置项覆盖、状态更新等场景。

  • 使用 Object.assign(){...obj1, ...obj2} 实现浅层合并
  • 若需深层合并,需自定义逻辑或使用工具函数

示例:

const defaults = { timeout: 5000, retry: 3 };
const options = { timeout: 2000 };
const config = { ...defaults, ...options }; // { timeout: 2000, retry: 3 }

基本上就这些。理解浅拷贝与深拷贝的区别,能帮助我们避免意外的数据污染。选择合适的方法取决于具体需求,比如性能要求、数据结构复杂度等。

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


相关文章: 蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  在Typer应用中优雅地处理和重组任意命令行参数  Win11怎么关闭快速启动_Win11彻底关机设置教程  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  React中useState与局部变量:理解组件状态管理与渲染机制  Fabric模组开发:自定义物品与物品组的现代管理方法  Steam官网入口直达 Steam注册及登录步骤  WooCommerce后台产品编辑页:获取分类ID并实现角色权限控制  汽车之家官方网站官网入口_汽车之家网页版直接进入  AO3官方可用镜像 Archive of Our Own网页版最新入口  写好的html代码怎么运行出来_运行写好的html代码方法【教程】  C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入  Python Socket多播通信中指定源IP地址的实践指南  怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】  漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  qq游戏跨平台入口_qq游戏多设备同步登录  红果短剧网页版官网入口 官方最新网址发布  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  FullCalendar 自定义按钮样式定制指南  J*a递归快速排序中静态变量的状态管理与陷阱  J*aScript实现动态背景色下的文本与按钮颜色自适应调整  抖音创作助手登录入口_抖音创作辅助工具官网直达  如何将HTML表格多行数据保存到Google Sheet  黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  优化大型XML文件解析:基于Python流式处理的内存高效方案  qq游戏手机版下载安装_qq游戏移动端入口  解决J*aScript中重复选择项的确认对话框显示问题  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注  Lar*el开发:如何在编辑界面正确预选数据库中的多选标签  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  mc.js官网登录入口 mc.js官方登录入口最新版  WordPress插件开发:正确注册卸载钩子与避免常见陷阱  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践  Python自定义类排序:解决lambda键值访问TypeError的实践指南  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  如何将HTML表格多行数据保存到Google Sheets  微信网页版官方入口教程 微信网页版网页版快速登录步骤  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道  Django通过AJAX异步上传图片并保存至模型的完整指南  Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询  Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  2025-2030年全球乘用车销量预测:新能源成增长主力  Yii2模块参数配置指南:正确声明与访问模块级配置  Python中如何避免重复条件判断:利用数据结构实现动态逻辑 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!