新闻中心
j*ascript_如何实现深拷贝对象
答案:J*aScript深拷贝可通过JSON方法、递归实现或WeakMap处理循环引用。1. JSON.stringify/parse适用于无函数、Date等简单对象;2. 手动递归可处理数组、Date、RegExp;3. 使用WeakMap避免循环引用导致的栈溢出,推荐用于复杂场景。

实现 J*aScript 中的对象深拷贝,关键在于创建一个与原对象完全独立的新对象,所有嵌套的属性和子对象也都被复制,而不是引用。
1. 使用 JSON.stringify 和 JSON.parse(简单场景)
对于不包含函数、undefined、Symbol、Date、RegExp 等特殊类型的对象,可以使用以下方法:
const deepClone = (obj) => { return JSON.parse(JSON.stringify(obj)); };说明:这种方法简单高效,但有明显局限。它会忽略值为函数、undefined、Symbol 的属性,且 Date 对象会被转为字符串。
2. 手动递归实现深拷贝(通用方案)
为了处理更复杂的数据类型,需要手动判断并递归复制:
const 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 clonedObj = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { clonedObj[key] = deepClone(obj[key]); } } return clonedObj; };说明:这个版本能正确处理数组、普通对象、Date 和正则表达式。通过递归遍历每个属性,确保深层嵌套也被复制。
Moshi Chat
法国AI实验室Kyutai推出的端到端实时多模态AI语音模型,具备听、说、看的能力,不仅可以实时收听,还能进行自然对话。
160
查看详情
3. 考虑循环引用(高级处理)
如果对象中存在循环引用(例如 a.b = a),上面的方法会导致栈溢出。可借助 WeakMap 记录已访问对象:
const deepClone = (obj, hash = new WeakMap()) => { if (obj === null || typeof obj !== 'object') return obj; if (hash.has(obj)) return hash.get(obj); if (obj instanceof Date) return new Date(obj); if (obj instanceof RegExp) return new RegExp(obj); const clonedObj = Array.isArray(obj) ? [] : {}; hash.set(obj, clonedObj); for (let key in obj) { if (obj.hasOwnProperty(key)) { clonedObj[key] = deepClone(obj[key], hash);
}
}
return clonedObj;
};
说明:WeakMap 存储原始对象与克隆对象的映射,遇到重复引用时直接返回已克隆的副本,避免无限递归。
基本上就这些。根据实际需求选择合适的方法。简单数据用 JSON 方法最快,复杂结构推荐带 WeakMap 的递归实现。
以上就是j*ascript_如何实现深拷贝对象的详细内容,更多请关注其它相关文章!
# 加载
# 扬州抖音seo教程
# 河南seo营销怎么操作
# 天津关键词快速排名软件
# 小程序推广网站运营
# 推广网站建设哪家公司好
# 海口怎么推广网站
# 软件推广的营销费用
# 美妆品牌营销推广方案ppt
# 珠海seo推广公司
# 咸宁网站建设咨询
# 遍历
# 还能
# javascript
# 有何不同
# 文件上传
# 键值
# 如何使用
# 如何实现
# 递归
# 栈
# 正则表达式
# json
# js
# java
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度
漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口
漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接
在FastAPI中利用lifespan与依赖注入高效管理Redis连接池
漫蛙2网页版漫画入口 漫蛙漫画在线官方登录
蛙漫2台版漫画地址 Manwa2正版网页版链接
Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录
css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异
2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC
微信网页版官方快速登录入口 微信网页版网页版账号直达
C++ explicit关键字防止隐式转换_C++构造函数安全规范
知音漫客正版漫画平台_知音漫客官网账号登录
免费抖音短视频入口_抖音网页版短视频免费通道
菜鸟取件码是什么怎么查 最全查询渠道汇总
Pandas DataFrame 多条件优先级排序与排名
jQuery Mask 插件中实现电话号码固定前导零的教程
vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法
J*aScript中如何高效提取对象指定属性
win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】
EMS快递官网app_中国邮政速递物流手机客户端
京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比
电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】
在哪找SublimeJ远程工具_SFTP插件配置教程
深入理解与实现最大堆的Heapify过程:常见错误与修正
在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略
从OpenAI API响应中高效提取生成文本
C++如何操作注册表_Windows平台下C++读写注册表的API函数详解
J*aScript中针对特定容器内图片动画的实现教程
在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析
c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架
b站赚钱渠道_b站收益来源
怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】
J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程
c++项目目录结构应该如何组织_c++工程化项目结构规范
AO3访问入口汇总 AO3网页版同人作品一键直达
在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法
mysql如何设置表访问权限_mysql表访问权限配置
TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法
在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验
J*a 递归快速排序中静态变量的状态管理与陷阱
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
Golang如何使用context实现超时取消_Golang context超时取消模式实践
使用Pandas转换并合并DataFrame:多列映射至统一结构
58动漫网在线官方网 58动漫网正版动漫入口网址
Win11怎么关闭快速启动_Win11彻底关机设置教程
深入理解J*aScript Promise异步执行与微任务队列
4399免费游戏网址入口 4399小游戏免费入口点开即玩
使用J*aScript检测输入元素是否包含在特定类中


2025-12-05
浏览次数:次
返回列表