新闻中心

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

2025-11-07
浏览次数:
返回列表
浅拷贝只复制对象第一层属性,引用类型共享内存,修改嵌套属性会影响原对象;深拷贝递归复制所有层级,生成完全独立的对象。常见浅拷贝方法有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,说明共享引用

什么是深拷贝?

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

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

火龙果写作 火龙果写作

用火龙果,轻松写作,通过校对、改写、扩展等功能实现高质量内容生产。

火龙果写作 277 查看详情 火龙果写作 常见实现方式:
  • 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深拷贝与浅拷贝原理与实现方法的详细内容,更多请关注其它相关文章!


# javascript  # 定制营销型网站建设  # 松岗推广软件招聘网站  # 医院网站建设价格低  # 怎么用内链优化网站  # 第一层  # 何为  # 绑定  # 表单  # 弹出  # 运算符  # 的是  # 背景色  # 数据结构  # 递归  # 区别  # json  # js  # java  # js完整使用教程  # 跨境电商seo  # seo关键词排名优化价格多少  # 宝鸡网站推广怎么样  # 百度推广营销管培生招聘  # 永宁网站优化哪家靠谱  # 营销经典广告推广语录大全 


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


相关推荐: 现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践  深入理解J*a编译器的兼容性选项:从-source到--release  word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法  解决移动端滚动问题的overflow属性应用指南  PySpark中从现有列右侧提取可变长度字符创建新列的教程  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  微信网页版官方入口教程 微信网页版网页版快速登录步骤  可靠CSGO开箱平台解析 CSGO开箱网合集  j*a toString()的覆盖  微信客户端如何收红包_微信客户端接收红包使用教程  Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】  composer的"require-dev"部分是用来做什么的?  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明  J*aScript中如何高效提取对象指定属性  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】  Golang如何使用context实现超时取消_Golang context超时取消模式实践  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  C++如何比较两个字符串_C++ string compare函数与操作符对比  C++如何生成随机数_C++ random库使用方法与范围设置  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  Discord Slash 命令响应超时问题的异步解决方案  Lar*el 8 多关键词数据库搜索优化实践  mysql如何设置表访问权限_mysql表访问权限配置  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  Promise错误处理:在catch后终止链式then执行的策略  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  J*aScript map 迭代中检测空数组元素的有效方法  Typer应用中灵活处理命令行参数的令牌化与解析  J*aScript实现单选按钮与关联输入框的联动禁用教程  字由网在线版登录地址 字由网网页版安全入口  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比  UC浏览器网页版登录入口官网 电脑版网址入口  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  AO3最新入口2025公告_AO3中文官网合集  基于动态规划的房屋花卉种植最小成本算法详解  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择  KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  Golang并发任务中错误如何聚合_Golang goroutine error收集方式 

搜索