新闻中心
J*aScript中如何深拷贝对象_有哪些实现方法
J*aScript深拷贝核心是创建完全独立的新对象,避免引用共享;常用方法包括JSON.parse(JSON.stringify())(简洁但有类型限制)、structuredClone()(现代标准,支持多类型)、手写递归(可控但复杂)和Lodash的cloneDeep()(全面稳妥)。

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
一键生成动漫二次元头像和插图
347
查看详情
- 用
typeof和Array.isArra区分基本类型、数组、普通对象
y() - 用
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邮箱在线邮箱官方通道


2025-12-16
浏览次数:次
返回列表
y()