新闻中心

J*aScript深拷贝_对象复制完全指南

2025-11-22
浏览次数:
返回列表
深拷贝需递归复制对象所有层级。1. JSON.parse(JSON.stringify()) 快但不支持函数、循环引用等;2. 手写递归函数可处理 Date、RegExp 和循环引用;3. structuredClone() 原生支持多数类型且性能好,但兼容性有限;4. Lodash 的 _.cloneDeep() 最稳定,适合复杂场景。

javascript深拷贝_对象复制完全指南

J*aScript中实现对象的深拷贝,是开发中常见但容易出错的问题。浅拷贝只复制对象的第一层属性,而嵌套的对象或数组仍然共享引用。深拷贝则会递归复制所有层级,确保新对象与原对象完全独立。下面介绍几种实用且可靠的深拷贝方法。

1. 使用 JSON.parse(JSON.stringify())

这是最简单快捷的深拷贝方式,适用于大多数纯数据对象。

注意:这种方法有明显限制:
  • 无法处理函数、undefined、Symbol等非序列化值
  • 会忽略不可枚举属性和原型链上的属性
  • 循环引用会导致报错
  • Date对象会被转为字符串

示例:

const obj = { name: "Alice", info: { age: 25 } };
const copied = JSON.parse(JSON.stringify(obj));
obj.info.age = 30;
console.log(copied.info.age); // 25,成功隔离

2. 手写递归深拷贝函数

自己实现一个兼容性更好的 deepClone 函数,可以处理更多类型和边界情况。

基本思路:判断数据类型,对对象和数组递归复制,其他类型直接返回。

function deepClone(obj, visited = new WeakMap()) {
  if (obj === null || typeof obj !== 'object') return obj;
  
  // 处理日期
  if (obj instanceof Date) return new Date(obj);
  
  // 处理正则
  if (obj instanceof RegExp) return new RegExp(obj);
  
  // 防止循环引用
  if (visited.has(obj)) return visited.get(obj);
  
  // 保留构造函数信息
  const clone = Array.isArray(obj) ? [] : {};
  visited.set(obj, clone);

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

这个版本支持循环引用(使用 WeakMap),也能正确处理 Date 和 RegExp 类型。

3. 利用结构化克隆算法(浏览器 API)

现代浏览器提供 structuredClone() 方法,原生支持深拷贝,且支持更多类型。

Avatar AI Avatar AI

AI成像模型,可以从你的照片中生成逼真的4K头像

Avatar AI 92 查看详情 Avatar AI
const original = { date: new Date(), nested: { count: 1 } };
const cloned = structuredClone(original);

优点:

  • 原生支持,性能好
  • 支持 Date、RegExp、Map、Set、ArrayBuffer 等
  • 自动处理循环引用
缺点:Node.js 在较早版本中不支持(需 v17+),部分旧浏览器不兼容。

4. 使用第三方库(如 Lodash)

Lodash 的 _.cloneDeep() 是最稳定的解决方案之一。

const _ = require('lodash');
const obj = { a: 1, b: { c: 2 } };
const copied = _.cloneDeep(obj);

优势:

  • 兼容性极好,支持各种复杂类型
  • 经过大量测试,稳定性高
  • 处理循环引用无压力

如果项目已引入 Lodash,推荐直接使用。

基本上就这些主流方法。选择哪种取决于你的使用场景:简单数据用 JSON 方式最快,需要兼容性选 Lodash,现代项目可尝试 structuredClone,自定义需求可手写递归函数。关键是理解每种方法的边界和限制。

以上就是J*aScript深拷贝_对象复制完全指南的详细内容,更多请关注其它相关文章!


# 适用于  # 大冶贸易网站建设  # 营销网站推广案例  # 江西网站推广排名好不好  # 家装网站建设方案小学  # 天津关键词排名样式  # 海外推广网站哪个好做些  # 全国网站建设优化服务商  # 佛山网站建设商家有哪些  # 高清网站推广怎么做最好  # 青岛网站关键词推广哪好  # 几种  # 性能好  # 中文网  # 相关文章  # 深拷贝  # 也能  # 扁平化  # 这是  # 如何实现  # 递归  # red  # 递归函数  # 浏览器  # node  # json  # node.js  # js  # java  # javascript 


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


相关推荐: 在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  steam官方入口大全 steam账号注册及操作指南  CSS子选择器:如何区分并样式化嵌套列表的子层级  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  将HTML Canvas内容转换为可上传的图像文件(File对象)  AO3最新可访问网址 Archive of Our Own官方在线入口  Node.js中HTML按钮与J*aScript函数交互的正确姿势  淘宝支付提示失败如何解决 淘宝支付流程优化方法  抖音极速版最新版本 抖音极速版官方下载地址  《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!  如何在 Excel Online 和 Google 表格中更改日期格式  C++ map遍历方法大全_C++ map迭代器使用总结  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  C#中解析不规范的HTML为XML 常见的坑与解决办法  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  j*a toString()的覆盖  Golang如何使用const iota_Go iota常量计数器讲解  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  J*aScript中localStorage数据的获取、清洗与格式化教程  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  HTML长属性值处理:表单action路径优化与代码规范应对  快手网页版在线登录 快手网页版官网入口快速访问  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略  Composer如何解决json扩展缺失的错误  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  小米Civi 4录制视频过暗_小米Civi 4亮度优化  AI泡沫首次被“刺破”:GPU十年都无法存活!  葱吃多了会怎样 葱吃多了会伤胃吗  J*aScript:在map操作中高效处理空数组  QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址  Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  如何在J*a中使用Locale处理多语言环境  黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  将JSON对象数组转置为键值对列表的实用指南  Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】  Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  QQ官网正版登录链接 QQ在线登录入口最新  c++如何使用Meson构建系统_c++比CMake更快的构建工具 

搜索