新闻中心

J*aScript深拷贝与浅拷贝的几种方式_j*ascript技巧

2025-11-06
浏览次数:
返回列表
浅拷贝只复制对象第一层属性,深层仍共享引用;深拷贝递归复制所有层级,完全断开引用。常用浅拷贝方法有Object.assign()、扩展运算符、slice()/concat();深拷贝可使用JSON.parse(JSON.stringify())(有限制)、递归实现、structuredClone()或Lodash的cloneDeep()。示例表明浅拷贝修改嵌套属性会影响原对象,而深拷贝不会。手动实现深拷贝需处理对象、数组、基本类型及特殊类型,但简单递归未解决循环引用,生产环境推荐成熟库。选择方式应根据数据类型、性能需求和兼容性综合考虑。

javascript深拷贝与浅拷贝的几种方式_javascript技巧

J*aScript中的深拷贝和浅拷贝主要针对引用类型(如对象、数组)在赋值时的行为差异。浅拷贝只复制对象的第一层属性,深层嵌套仍共享同一引用;而深拷贝会递归复制所有层级,完全断开引用关系。下面介绍几种常见的实现方式。

浅拷贝的常用方法

浅拷贝适用于只需复制第一层属性的场景,修改嵌套属性时仍会影响原对象。

  • Object.assign():将源对象的所有可枚举属性复制到目标对象。注意仅复制一层。
  • 扩展运算符 {...} :语法简洁,常用于对象或数组的浅复制。
  • Array.prototype.slice() / concat():适用于数组,生成新数组但不深拷贝内部元素。

示例:

// 对象浅拷贝
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = Object.assign({}, obj1);
obj2.b.c = 3;
console.log(obj1.b.c); // 输出 3,说明是浅拷贝

深拷贝的基本方法

深拷贝能彻底隔离新旧对象,适合复杂嵌套结构。

  • JSON.parse(JSON.stringify()):最简单的方法,但有局限性,无法处理函数、undefined、Symbol、循环引用等。
  • 递归实现深拷贝:手动遍历对象属性,对引用类型递归调用拷贝函数,可控性强。
  • 使用结构化克隆算法(Structured Clone):部分浏览器支持,如 structuredClone(),支持多数数据类型。
  • 第三方库(如 Lodash):提供成熟的 _.cloneDeep() 方法,兼容性好。

示例:JSON方式

BrandCrowd BrandCrowd

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

BrandCrowd 200 查看详情 BrandCrowd const obj1 = { a: 1, b: { c: 2 } };
const obj2 = JSON.parse(JSON.stringify(obj1));
obj2.b.c = 3;
console.log(obj1.b.c); // 输出 2,成功深拷贝

手动实现一个简易深拷贝函数

通过类型判断和递归,可以处理大多数情况。

function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') return obj;
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof Array) return obj.map(item => deepClone(item));
  if (typeof obj === 'object') {
    const cloned = {};
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        cloned[key] = deepClone(obj[key]);
      }
    }
    return cloned;
  }
}

这个版本能处理对象、数组、基本类型和嵌套结构,但未解决循环引用问题。生产环境建议使用成熟库。

注意事项与适用场景

选择拷贝方式需结合实际需求。

  • 若对象不含函数、日期、Symbol 等特殊类型,JSON方法最快捷。
  • 需要完整支持各种类型时,推荐使用 Lodash 的 cloneDeep
  • 频繁操作且性能敏感,可考虑优化的递归实现或 structuredClone(现代浏览器)。
  • 注意循环引用会导致递归爆栈或JSON报错,需额外检测。

基本上就这些,理解原理后可根据项目需求灵活选择。

以上就是J*aScript深拷贝与浅拷贝的几种方式_j*ascript技巧的详细内容,更多请关注其它相关文章!


# 扁平化  # seo优化页面不符  # 网站扁平结构优化策略  # 外贸网站推广收费多少合理  # 建湖seo优化品牌  # 口红关键词排名  # 选服务好的网站建设  # 广西地理网站建设项目  # 韶山网站建设免费咨询  # 网站推广方案文档  # 花桥花桥企业网站建设  # 推荐使用  # 只需  # 遍历  # 拷贝  # 适用于  # 第一层  # 运算符  # 如何实现  # 几种  # 递归  # red  #   # 浏览器  # json  # js  # java  # javascript 


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


相关推荐: CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  DLsite中文平台入口 DLsite官网内容在线查看  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  漫蛙2正版漫画站 漫蛙2网页版快速访问入口  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  谷歌推RCS信息存档功能:公司可监控员工私密信息!  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  AO3最新官网入口公告_2025AO3镜像站实时查询方法  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  Go语言中JSON数据解码与字段访问指南  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  必由学官方网站入口 必由学学生教师共用登录通道  MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  Composer如何在生产环境安全地执行composer update  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  新手怎么开始学化妆 零基础化妆入门教程  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  零跑汽车11月交付量达70327台 实现连续9个月正增长  PDF文件体积过大处理_PDF压缩技巧详解  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  在Go Martini框架中高效服务动态生成图像的实践指南  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  Typer应用中灵活处理命令行参数的令牌化与解析  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  机器学习中对数变换预测结果的反向还原  C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果  Win11怎么开启省电模式_Win11电池节电模式自动开启  b站怎么删除评论_b站评论管理与删除操作  fishbowl官网免费版 fishbowl养鱼网站入口  CSS子选择器:如何区分并样式化嵌套列表的子层级  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  响应式容器内容自动缩放与宽高比维持教程  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性  整合Supabase认证与Django模型:跨模式迁移的解决方案  c++ dfs和bfs代码 c++深度广度优先搜索算法  GemBox Document HTML转PDF垂直文本渲染问题及解决方案 

搜索