JS深拷贝浅拷贝怎么区分_JS深拷贝与浅拷贝原理与实现方法


浅拷贝只复制对象第一层属性,引用类型共享内存,修改嵌套属性会影响原对象;深拷贝递归复制所有层级,生成完全独立的对象。常见浅拷贝方法有Object.assign()、展开运算符;深拷贝可用JSON.parse(JSON.stringify())或递归实现,后者可处理函数、循环引用等复杂情况。

js深拷贝浅拷贝怎么区分_js深拷贝与浅拷贝原理与实现方法

在J*aScript中,深拷贝浅拷贝都是用来复制对象的方法,但它们的行为有本质区别。理解两者的原理和实现方式,对处理复杂数据结构非常重要。

什么是浅拷贝?

浅拷贝是指创建一个新对象,这个新对象拥有原对象属性的直接值或引用。如果原对象的属性是基本类型,拷贝的是值;如果是引用类型(如数组、对象),拷贝的是内存地址,也就是说,新旧对象会共享同一块堆内存。

这意味着:修改拷贝后的对象中的引用类型属性,会影响原始对象。

常见实现方式:
  • Object.assign():只能实现一级属性的浅拷贝
  • 展开运算符 {...obj}:同上,只复制第一层
  • 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,说明共享引用

什么是深拷贝?

深拷贝会递归地复制对象的所有层级,包括嵌套的对象和数组,生成一个完全独立的新对象。原对象和拷贝对象互不影响。

深拷贝的关键在于:所有引用类型都被重新创建,不共享任何内存。

LALAL.AI LALAL.AI

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

LALAL.AI 196 查看详情 LALAL.AI 常见实现方式:
  • JSON.parse(JSON.stringify(obj)):简单有效,但有局限性(不能处理函数、undefined、Symbol、循环引用等)
  • 递归手动实现:可以控制各种数据类型,更灵活
  • 使用第三方库:如 Lodash 的 _.cloneDeep()

示例(JSON方法):

const obj1 = { a: 1, b: { c: 2 } };
const obj2 = JSON.parse(JSON.stringify(obj1));
obj2.b.c = 3;
console.log(obj1.b.c); // 输出 2,互不影响

注意:JSON方法无法处理函数、正则、Date对象可能出错、以及循环引用会报错。

如何手动实现一个简易深拷贝?

通过递归判断数据类型,分别处理对象、数组和其他类型。

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;
}

这个版本支持循环引用(使用WeakMap),避免无限递归。

浅拷贝与深拷贝的核心区别总结

  • 浅拷贝只复制一层,深层仍共用引用
  • 深拷贝完全独立,每一层都重新创建
  • 性能上:浅拷贝快,深拷贝慢,尤其对象层级深时
  • 使用场景:若对象不含嵌套引用,浅拷贝足够;否则建议深拷贝
基本上就这些。选择哪种方式,取决于数据结构复杂度和是否需要完全隔离。

以上就是JS深拷贝浅拷贝怎么区分_JS深拷贝与浅拷贝原理与实现方法的详细内容,更多请关注其它相关文章!


# 第一层  # 重阳节营销推广目标  # 招商加盟seo推广方案  # 社团外联网站建设方案  # 龙海营销型网站建设  # 濮阳网站建设服务公司  # 嘉兴营销推广哪家好  # 松江区官方网站优化排名  # 抖音源码seo  # 海兴网站优化推广  # 济宁网站建设企业  # 都是  # 非标准  # js完整使用教程  # 中对  # 自定义  # 运算符  # 的是  # 表单  # 数据结构  # 递归  # 区别  # json  # js  # java  # javascript 


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


相关推荐: 快手缓存清理方法  FotoBalloon图片左右镜像教程  Three.js中动态更换3D模型纹理的教程  《雷电模拟器》自动点击设置方法  苹果自助维修计划支持哪些设备机型  如何在CSS中实现盒模型多列间距_grid-gap与padding结合  pubmed数据库官方主页_pubmed学术论文查找官网直达  猫眼电影app如何参与官方的抽奖活动_猫眼电影官方抽奖参与方法  Animex动漫社社登录官网 Animex动漫社资源社入口直达  优酷官网登录入口电脑版 优酷官网网址入口  《伊瑟》凶影追缉库卢鲁boss攻略  小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】  支付宝如何解绑云闪付_支付宝与云闪付账户关联解除方法  腾讯QQ邮箱官方入口 QQ邮箱网页版登录平台  实时数据流中高效查找最小值与最大值  mysql如何限制远程访问_mysql远程访问限制方法  《合金装备4》有望推出重制版!制作人发话了  Yandex俄罗斯搜索引擎官网入口 Yandex网页端直接访问  我的世界游戏平台入口 我的世界官方官网直达链接  《跳跳舞蹈》循环播放方法  抖音如何进行蓝V认证 抖音企业号申请所需资料与流程  PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】  mysql如何配置从库只读_mysql从库只读设置方法  J*aScript对象中深度嵌套URL键的查找与更新策略  如何在mysql中使用索引提示_mysql索引提示优化方法  windows10怎么更改下载路径_windows10默认存储位置修改教程  从HTML表单获取逗号分隔值并转换为NumPy数组进行预测  折叠屏手机充不进电是什么问题? 特殊结构带来的维修难点  小米倒班助手添加日历提醒  Linux如何优化系统启动流程_Linux启动项优化方案  MacBook Pro词典使用指南  《大润发优鲜》充值方法介绍  rabbitmq 持久化有什么缺点?  钉钉任务无法提醒如何处理 钉钉任务提醒优化方法  猫眼app抢票快还是小程序快  Python对象引用与属性赋值:理解链表中的行为  解决SQLAlchemy模型跨文件关联的Linter兼容性指南  iPhone 15 Pro如何查看存储空间占用_iPhone 15 Pro存储空间查看教程  《下一站江湖2》独孤剑诀习得方法  芒果TV官网登录入口 芒果TV官方网站登录入口  动漫岛在线动漫网 动漫岛动漫在线观看官方入口  支付宝网页版在线入口 支付宝官网电脑登录入口  Python项目中的条件导入:解决跨模块依赖问题  TikTok私信无法发送表情怎么办 TikTok消息表情发送修复方法  qq音乐官方网站入口_qq音乐在线听歌网页版链接  研招网官方网站招生平台入口_中国研究生招生信息网官网登录  Win10输入法不见了怎么办 Win10找回语言栏图标教程  虫虫助手如何更新游戏  漫蛙manwa官网浏览入口_漫蛙漫画网页版访问链接  React应用中Commerce.js数据加载与状态管理最佳实践 

 2025-11-07

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

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

点击免费数据支持

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