新闻中心
J*aScript深拷贝_对象复制完全指南
深拷贝需递归复制对象所有层级。1. JSON.parse(JSON.stringify()) 快但不支持函数、循环引用等;2. 手写递归函数可处理 Date、RegExp 和循环引用;3. structuredClone() 原生支持多数类型且性能好,但兼容性有限;4. Lodash 的 _.cloneDeep() 最稳定,适合复杂场景。

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
AI成像模型,可以从你的照片中生成逼真的4K头像
92
查看详情
const original = { date: new Date(), nested: { count: 1 } };
const cloned = structuredClone(original);
优点:
- 原生支持,性能好
- 支持 Date、RegExp、Map、Set、ArrayBuffer 等
- 自动处理循环引用
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更快的构建工具


2025-11-22
浏览次数:次
返回列表