新闻中心

J*aScript中如何深拷贝对象_有哪些实现方法

2025-12-16
浏览次数:
返回列表
J*aScript深拷贝核心是创建完全独立的新对象,避免引用共享;常用方法包括JSON.parse(JSON.stringify())(简洁但有类型限制)、structuredClone()(现代标准,支持多类型)、手写递归(可控但复杂)和Lodash的cloneDeep()(全面稳妥)。

javascript中如何深拷贝对象_有哪些实现方法

J*aScript中深拷贝对象,核心是创建一个与原对象完全独立的新对象,新对象的属性值(包括嵌套对象、数组)都不与原对象共享引用。直接赋值或浅拷贝(如Object.assign()、展开运算符{...obj})只复制第一层,深层仍共用内存地址,修改嵌套内容会影响原对象。

使用 JSON.parse(JSON.stringify()) —— 简单但有局限

这是最常用、写法最简洁的方法,适合纯数据对象(只含字符串、数字、布尔值、null、数组、普通对象):

  • ✅ 优点:一行代码搞定,无依赖,兼容性好
  • ❌ 缺点明显:
      • 会丢失函数、undefined、Symbol、Date、RegExp、Map、Set、BigInt等类型
      • 循环引用会直接报错(TypeError: Converting circular structure to JSON
      • Date 变成字符串,正则变成空对象

示例:

const obj = { a: 1, b: { c: 2 } };
const copy = JSON.parse(JSON.stringify(obj)); // ✅ 深拷贝成功

使用 structuredClone() —— 现代浏览器推荐方案

这是 ES2025 新增的标准 API,专为深拷贝设计,支持更多内置类型且能处理循环引用(部分环境):

  • ✅ 支持 Map、Set、Date、RegExp、ArrayBuffer、TypedArray、Error、Blob 等
  • ✅ 原生、安全、无需第三方库
  • ⚠️ 注意:
      • 目前不支持函数、undefined、Symbol(同 JSON 方法)
      • 循环引用在 Chrome 98+、Firefox 94+、Safari 15.4+ 支持;旧版本不支持会抛错

示例:

const obj = { date: new Date(), re: /abc/g };
const copy = structuredClone(obj); // ✅ 正确保留日期和正则

手写递归深拷贝 —— 完全可控,适合学习或特殊需求

适用于需要自定义行为(如忽略某些字段、处理函数、兼容老环境)的场景。关键逻辑是判断类型、递归处理对象/数组,其他类型直接返回:

Waifulabs Waifulabs

一键生成动漫二次元头像和插图

Waifulabs 347 查看详情 Waifulabs
  • typeofArray.isArray() 区分基本类型、数组、普通对象
  • Object.prototype.toString.call()instanceof 识别 Date、RegExp 等内置对象
  • 需用 WeakMap 记录已拷贝的对象,避免循环引用无限递归

简化版示意(不含循环引用处理):

function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') return obj;
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof RegExp) return new RegExp(obj);
  const clone = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      clone[key] = deepClone(obj[key]);
    }
  }
  return clone;
}

借助第三方库 —— 生产环境稳妥选择

Lodash 的 _.cloneDeep() 是最成熟稳定的方案,覆盖几乎所有边界情况:

  • ✅ 支持函数、undefined、循环引用、各种内置对象、不可枚举属性
  • ✅ 经过大量测试,性能优化良好
  • ⚠️ 缺点:引入额外依赖,包体积增加(可按需导入)

示例:

import { cloneDeep } from 'lodash-es';
const copy = cloneDeep(originalObj);

基本上就这些。日常开发优先考虑 structuredClone()(兼容性满足时),老项目或需极致兼容用 Lodash;JSON 方案仅限简单数据结构;手写适合教学或定制化强的场景。

以上就是J*aScript中如何深拷贝对象_有哪些实现方法的详细内容,更多请关注其它相关文章!


# 不支持  # 梁山网络seo公司  # 模仿网站建设游戏违法吗  # 廊坊网站建设信息公示  # 整合与推广营销的关系是  # 东营电脑网站优化  # 企业网站建设用网  # 网站的推广有哪些类型  # 铜山区关键词seo排名优化  # 天津综合网络营销推广  # 丽人丽妆的营销推广要点  # 有什么不同  # 多线程  # 第三方  # 深拷贝  # 这是  # 有哪些  # 数据结构  # 运算符  # 如何实现  # 递归  # red  # safari  # 浏览器  # json  # js  # java  # javascript 


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


相关推荐: J*a应用程序首次运行自动创建文件与目录的最佳实践  Archive of Our Own官网直达 AO3最新可用地址一览  AO3同人作品网入口 AO3搜索引擎官网永久地址  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  163邮箱注册官网 免费申请163个人邮箱  React列表渲染与独立状态管理:避免全局状态影响局部更新  电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  在Typer应用中优雅地处理和重组任意命令行参数  Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择  漫蛙网页登录入口 漫蛙漫画官方授权网址  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  网站内容防复制粘贴的实现策略与局限性  火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧  AO3最新可访问网址 Archive of Our Own官方在线入口  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  《主播少女的秘密账号迷宫》首支宣传片  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  poki免费入口快捷访问 poki人气小游戏直接玩站点  UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】  JUnit5/Mockito:优雅测试内部依赖与异常处理的实践  漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址  AngularJS $http POST请求数据传递与Go后端接收实践  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  在python-socketio事件处理器中安全访问Flask应用上下文  如何使用Go和Martini动态服务解码后的图片  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  Django表单提交验证失败后保持字段值不刷新  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口  在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用  苹果手机如何防止被恶意App追踪  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  HTML长属性值处理:表单action路径优化与代码规范应对  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  Win11怎么开启省电模式_Win11电池节电模式自动开启  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  解决Flask中Quill编辑器内容提交失败及TypeError的指南  windows10怎么查看本机ip_windows10命令提示符ipconfig使用  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道 

搜索