新闻中心
JS如何实现深拷贝_J*aScript深拷贝与浅拷贝区别及实现方法
深拷贝与浅拷贝的核心区别在于对引用类型处理方式不同:浅拷贝仅复制对象第一层属性,嵌套对象仍共享引用,修改会相互影响;深拷贝则递归复制所有层级,生成完全独立的新对象。常见浅拷贝方法包括Object.assign、扩展运算符、slice/concat等,但均只复制引用地址;JSON.parse(JSON.stringify(obj))可实现深拷贝,但无法处理函数、undefined、Symbol、循环引用及Date类型;手写递归深拷贝通过WeakMap解决循环引用问题,支持Date、RegExp等特殊类型,兼容性好;structuredClone为现代浏览器提供的原生深拷贝API,功能强大且支持复杂类型和循环引用,但兼容性有限。实际应用中需根据数据结构复杂度、特殊类型存在与否及浏览器兼容需求选择合适方案,手写递归通常是最稳妥选择。

J*aScript中的深拷贝和浅拷贝主要区别在于对引用类型数据的处理方式。当你复制一个对象时,如果该对象包含嵌套的对象或数组,浅拷贝只会复制第一层属性,而更深层的引用仍然指向原对象;深拷贝则会递归复制所有层级,生成一个完全独立的新对象。
浅拷贝 vs 深拷贝的区别
浅拷贝:只复制对象的第一层属性。对于基本类型值,复制的是值本身;对于引用类型(如对象、数组),复制的是引用地址,因此新旧对象共享嵌套结构,修改会影响彼此。
深拷贝:递归复制对象的所有层级,包括嵌套的对象和数组,生成一个全新的、与原对象无任何关联的独立副本。修改新对象不会影响原对象。
常见浅拷贝方法:- Object.assign({}, obj)
- {...obj}
- Array.prototype.slice() / concat()
JSON.stringify + JSON.parse 实现深拷贝
这是最简单的深拷贝方法之一:
const deepCopy = JSON.parse(JSON.stringify(originalObj));
优点:语法简单,能处理大多数普通对象和数组的深拷贝。
缺点:有明显局限性:
- 无法处理函数、undefined、Symbol等非可序列化类型
- 会忽略 Symbol 属性键
- 不能处理循环引用(会报错)
- Date 对象会被转为字符串
因此,仅适用于纯数据对象(POJO)且不含特殊类型的场景。
BrandCrowd
一个在线Logo免费设计生成器
200
查看详情
手写递归实现深拷贝
为了克服 JSON 方法的限制,可以手动编写递归函数实现更完整的深拷贝:
function deepClone(obj, hash = new WeakMap()) {<br>
if (obj == null) return obj;<br>
if (typeof obj !== 'object') return obj;<br>
if (obj instanceof Date) return new Date(obj);<br>
if (obj instanceof RegExp) return new RegExp(obj);<br>
// 防止循环引用<br>
if (hash.has(obj)) return hash.get(obj);<br>
// 保留构造函数信息<br>
const clone = new obj.constructor();<br>
hash.set(obj, clone);<br>
for (let key in obj) {<br>
if (obj.hasOwnProperty(key)) {<br>
clone[key] = deepClone(obj[key], hash);<br>
}<br>
}<br>
return clone;<br>
}
这个版本支持 Date、RegExp,并使用 WeakMap 解决循环引用问题,兼容性较好。
使用 structu
redClone(现代浏览器)
现代浏览器提供了原生的深拷贝 API:
const deepCopy = structuredClone(originalObj);
它支持很多复杂类型,包括 transferable objects,也支持循环引用。但兼容性有限(Chrome 98+ 等较新版本支持),不适合需要兼容老浏览器的项目。
基本上就这些常见的实现方式。选择哪种方法取决于你的具体需求:数据结构是否复杂、是否包含特殊类型、是否需要兼容老浏览器等。多数情况下,手写递归加 WeakMap 是比较稳妥的选择。
以上就是JS如何实现深拷贝_J*aScript深拷贝与浅拷贝区别及实现方法的详细内容,更多请关注其它相关文章!
# 第一层
# 怎么提高网站内链建设
# 东港网站运营推广
# 黄冈网站建设教程
# 塘厦seo优化推广公司
# 眉山seo网络推广营销
# 美业推广营销方案设计
# 足球直播网站建设
# 微信营销线上推广app
# 优化营销推广平台方案
# 石家庄井陉网站建设费用
# 移除
# 图中
# 数据处理
# 运算符
# js语法教程
# 多个
# 如何实现
# 的是
# 数据结构
# 递归
# red
# 区别
# 递归函数
# 浏览器
# json
# js
# java
# javascript
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相
qq游戏跨平台入口_qq游戏多设备同步登录
千牛数据看板网页版_千牛数据看板网页版访问方法
TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法
Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】
ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售
qq游戏免费畅玩入口_qq游戏电脑版快速启动
Pyrogram与g4f集成:异步编程实践与常见错误解决
提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
css滚动动画效果怎么实现_使用Animate.css滚动触发动画类
Mac怎么使用表情符号_Mac Emoji快捷键面板
谷歌google账号怎么注册账号 谷歌账号注册官方流程
如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式
Mac怎么查看崩溃日志_Mac控制台错误报告分析
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学
电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
Python中高效访问嵌套字典与列表中的键值对
PHP中高效并行检查多链接状态的教程
如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略
微博网页版官方账号登录 微博网页版内容浏览使用指南
神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正
汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口
解决Bootstrap卡片顶部边距导致背景图下移的问题
MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令
如何使用纯J*aScript判断Input元素是否在特定类容器内
Lar*el Form Request中唯一性验证在更新操作中的正确实现
b站怎么删除评论_b站评论管理与删除操作
QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口
R星幕后开发视频泄露 包含《GTA6》等多款大作
mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析
谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】
Python多线程中正确使用sigwait处理SIGALRM信号
PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比
照顾宝贝2小游戏免费秒玩入口
Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略
在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全
Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】
J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南
漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址
2026年CSGO开箱网站推荐 CSGO开箱平台精选
MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具
《GTA6》开发画面疑似泄露!这次可不是AI了
手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析
Mac终端命令大全_Mac常用Terminal指令速查


2025-11-06
浏览次数:次
返回列表
redClone(现代浏览器)