新闻中心

J*aScript深浅拷贝实现_对象复制方案

2025-11-29
浏览次数:
返回列表
深拷贝能完全复制对象及嵌套属性,避免引用共享;浅拷贝仅复制一级属性,嵌套对象仍共享内存。1. 浅拷贝用Object.assign或扩展运算符,无法隔离嵌套引用;2. 深拷贝可用JSON方法(限纯数据)或递归实现(支持Date、RegExp、循环引用等);3. 实际推荐:简单场景用JSON,复杂类型用手写递归或Lodash的cloneDeep。

javascript深浅拷贝实现_对象复制方案

J*aScript中对象和数组的复制不是简单的赋值就能解决的,因为引用类型的数据存储的是地址,直接赋值会导致多个变量指向同一个内存空间。改变其中一个,其他变量也会受到影响。为了解决这个问题,就需要用到深拷贝和浅拷贝。

浅拷贝实现方式

浅拷贝是指创建一个新对象,这个对象有着原始对象属性的一级副本。如果属性是基本类型,拷贝的就是值;如果是引用类型,拷贝的则是内存地址。

常见实现方法:
  • Object.assign():可将多个源对象的所有可枚举属性复制到目标对象
  • 扩展运算符(...):语法简洁,适用于对象和数组
  • 手动遍历赋值:适合简单场景,逐个复制属性

示例:

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,说明b是引用共享

可见,浅拷贝无法处理嵌套对象的独立复制。

深拷贝实现方式

深拷贝会递归地拷贝所有层级,确保新对象与原对象完全独立,互不影响。

常用方法包括:
  • JSON.stringify + JSON.parse:简单快捷,但有局限性
  • 递归实现:可控性强,能处理复杂类型
  • 借助第三方库(如 Lodash):功能完整,兼容性好

方法一:JSON 方法(适用于纯数据对象)

来画数字人直播 来画数字人|直播|

来画数字人自动化|直播|,无需请真人主播,即可实现24小时|直播|,无缝衔接各大|直播|平台。

来画数字人直播 57 查看详情 来画数字人直播
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = JSON.parse(JSON.stringify(obj1));

obj2.b.c = 3;
console.log(obj1.b.c); // 输出 2,成功隔离

限制:不能处理函数、undefined、Symbol、Date、RegExp 和循环引用。

方法二:手写递归深拷贝

function deepClone(target, map = new WeakMap()) {
  if (target === null || typeof target !== 'object') return target;

  // 处理日期
  if (target instanceof Date) return new Date(target);
  // 处理正则
  if (target instanceof RegExp) return new RegExp(target);

  // 防止循环引用
  if (map.has(target)) return map.get(target);

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

  for (let key in target) {
    if (Object.prototype.hasOwnProperty.call(target, key)) {
      clone[key] = deepClone(target[key], map);
    }
  }

  return clone;
}

这个版本支持对象、数组、Date、RegExp,并使用 WeakMap 避免循环引用问题。

实际应用建议

根据使用场景选择合适方案:

  • 若对象结构简单且只包含基本类型或普通对象数组,用 JSON 方法最快
  • 需要完整支持各种类型时,推荐使用 递归 + WeakMap 实现
  • 项目中频繁使用,可引入 _.cloneDeep 等成熟工具

基本上就这些,掌握原理后可以根据需求灵活调整实现方式。不复杂但容易忽略细节,比如循环引用和特殊对象处理。

以上就是J*aScript深浅拷贝实现_对象复制方案的详细内容,更多请关注其它相关文章!


# 的是  # 传统行业微信推广营销  # 湖南SEO优化设计软件  # 宿州网站推广效果  # 昌乐网络营销推广费用  # 360精准营销推广助手  # 网站seo关键字优化  # 中小型网站建设教学设计  # 黄山区品牌网站推广技巧  # 利用问答网站进行推广  # 中原短视频营销推广渠道  # 也会  # 加载  # javascript  # 按需  # 点对点  # 适用于  # 多个  # 运算符  # 如何实现  # 递归  # 工具  # json  # js  # java 


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


相关推荐: LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读  C++如何实现异步操作_C++11使用std::future和std::async进行异步编程  Django模型中自动计算可用余额的实现方法  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  怎么在mac上运行html代码_mac运行html代码方法【指南】  excel怎么制作工资条 excel快速生成工资条的方法  深入理解J*a合成构造器:何时以及为何阻止其生成  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  抖音网页版快捷访问 抖音网页版网页版入口操作教程  c++ 命名空间怎么用 c++ namespace使用指南  高德地图公交到站提醒失败如何解决 高德提醒权限设置  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  必由学网页版入口 必由学官方平台直接访问  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  jQuery Mask 插件中实现电话号码固定前导零的教程  微博网页版官方账号登录 微博网页版内容浏览使用指南  QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问  Win11怎么开启省电模式_Win11电池节电模式自动开启  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  Go语言HTML解析:利用Goquery精准获取指定元素内容  智慧团建扫码登录入口 智慧团建扫码登录入口官网版​  PostgreSQL海量数据高效导入策略:Python与Django实践指南  小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】  AO3网页版最新入口合集 Archive of Our Own在线访问指南  C++ explicit关键字防止隐式转换_C++构造函数安全规范  如何将HTML表格多行数据保存到Google Sheet  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】  拼多多赚钱渠道_拼多多收益来源  Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  Python中如何避免重复条件判断:利用数据结构实现动态逻辑  星露谷物语官网入口 星露谷物语游戏官网入口  b站赚钱渠道_b站收益来源  理解J*aScript Promise的微任务队列与执行顺序  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  J*aScript中安全有效地处理localStorage字符串数据  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  J*aScript DOM操作:高效清空列表元素的策略与实践  在python-socketio事件处理器中安全访问Flask应用上下文  PySpark中从现有列右侧提取可变长度字符创建新列的教程  基于动态规划的房屋花卉种植最小成本算法详解  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  age动漫网站入口 age动漫官网直接访问入口  漫蛙网页登录入口 漫蛙漫画官方授权网址 

搜索