新闻中心

j*ascript_如何实现深拷贝对象

2025-12-05
浏览次数:
返回列表
答案:J*aScript深拷贝可通过JSON方法、递归实现或WeakMap处理循环引用。1. JSON.stringify/parse适用于无函数、Date等简单对象;2. 手动递归可处理数组、Date、RegExp;3. 使用WeakMap避免循环引用导致的栈溢出,推荐用于复杂场景。

javascript_如何实现深拷贝对象

实现 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 Moshi Chat

法国AI实验室Kyutai推出的端到端实时多模态AI语音模型,具备听、说、看的能力,不仅可以实时收听,还能进行自然对话。

Moshi Chat 160 查看详情 Moshi Chat

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检测输入元素是否包含在特定类中 

搜索