新闻中心
对象拷贝:深拷贝与浅拷贝实现方案
浅拷贝只复制对象第一层属性,嵌套对象共享引用,修改会影响原对象;深拷贝递归复制所有层级,生成完全独立副本。常用浅拷贝方法有Object.assign、扩展运算符;深拷贝可用JSON.parse(JSON.stringify())、递归实现或Lodash的cloneDeep。

在J*aScript中,对象拷贝是一个常见需求。根据是否复制对象内部引用的数据,分为浅拷贝和深拷贝。理解两者的区别并掌握实现方式,对开发至关重要。
浅拷贝:只复制第一层属性
浅拷贝创建一个新对象,将原对象的可枚举属性复制过来,但如果属性值是引用类型(如对象或数组),则只复制引用地址,不会递归复制其内容。这意味着修改嵌套对象会影响原对象。
常见的浅拷贝方法包括:
- Object.assign():将多个源对象合并到目标对象
- 扩展运算符(...):语法简洁,适合日常使用
- for...in 循环手动赋值:兼容性好,可控性强
const obj = { a: 1, b: { c: 2 } };
const copy = { ...obj };
copy.b.c = 3;
console.log(obj.b.c); // 输出 3,说明共享引用
深拷贝:完全独立的副本
深拷贝会递归复制对象的所有层级,生成一个与原对象完全独立的新对象。修改拷贝后的对象不会影响原始对象。
Kreado AI
Kreado AI是一个多语言AI视频创作平台,只需输入文本或关键词,即可创作真实/虚拟人物的多语言口播视频。 为创作者提供A
I赋能
182
查看详情
实现深拷贝有多种方案,各有优劣:
- JSON.parse(JSON.stringify(obj)):简单快捷,但有明显限制,比如不支持函数、undefined、Symbol、循环引用等
- 递归实现:手动遍历对象属性,对引用类型继续调用深拷贝函数,能处理大多数情况
- 结构化克隆算法(Structured Clone):浏览器原生支持,可通过MessageChannel或postMessage实现,比JSON更强大
- 第三方库(如 Lodash):提供成熟的 _.cloneDeep 方法,兼容性好,功能全面
function deepClone(obj, seen = new WeakMap()) {
if (obj === null || typeof obj !== 'object') return obj;
if (seen.has(obj)) return seen.get(obj); // 处理循环引用
const clone = Array.isArray(obj) ? [] : {};
seen.set(obj, clone);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key], seen);
}
}
return clone;
}
选择建议
实际开发中应根据场景选择合适方式:
- 若对象结构简单且不含函数、日期等特殊类型,JSON方法足够用
- 需要完整支持各种数据类型时,推荐使用Lodash 的 cloneDeep
- 追求无依赖可使用递归+WeakMap实现,注意处理边界情况
- 浅拷贝适用于临时扩展对象、避免直接修改原对象的一层属性
以上就是对象拷贝:深拷贝与浅拷贝实现方案的详细内容,更多请关注其它相关文章!
# 是一个
# 广东教育网站推广热线
# 网站建设广告投放
# 安居贷营销推广
# 李沧区品牌网站建设优势
# 莱州全网营销推广公司
# 潍坊网站推广公司有哪些
# 器械企业怎么做网站推广
# 网络营销问答推广的意义
# seo快照更新
# 临沂产品营销推广中心
# 扁平化
# 第一层
# 多语言
# 性好
# 深拷贝
# 运算符
# 数据结构
# 如何实现
# 关键词
# 递归
# red
# 区别
# 浏览器
# json
# js
# java
# javascript
# 浅拷贝
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
解决深度学习模型训练初期异常高损失与完美验证准确率问题
汽水音乐在线解析 汽水音乐在线解析入口
葱吃多了会怎样 葱吃多了会伤胃吗
Python字典中优雅地迭代剩余元素的方法
Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询
QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台
Pandas DataFrame 多条件优先级排序与排名
荣耀Play7T运行卡顿解决_荣耀Play7T性能优化
Centos/Linux 系统下安装 composer 的完整步骤
基于动态规划的房屋花卉种植最小成本算法详解
C++如何操作注册表_Windows平台下C++读写注册表的API函数详解
Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧
css绝对定位元素脱离父容器怎么办_确保父元素position非static
在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析
Kafka Streams中基于消息头条件过滤消息的实现指南
Golang如何使用net/url解析URL_Golang URL解析与处理方法
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
理解Python模块与全局变量的作用域管理
漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口
怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】
消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技
vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧
C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件
Go语言中高效处理x-www-form-urlencoded表单数据
Go语言中对Map值调用带指针接收者方法:原理与最佳实践
Lar*el Excel导入时生成自定义递增ID的策略与实践
飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】
小红书网页版入口链接分享 小红书官网直接进
星露谷物语官网入口 星露谷物语游戏官网入口
Golang如何使用context实现超时取消_Golang context超时取消模式实践
QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网
QQ网页版官方账号入口 QQ网页版网页版登录指南
Tailwind CSS line-clamp 布局问题解析与修复指南
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案
Lar*el Form Request中唯一性验证在更新操作中的正确实现
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
绝地鸭卫平a核爆刀流玩法攻略
MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景
2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示
整合Supabase认证与Django模型:跨模式迁移的解决方案
J*aScript中在Map循环中检测并处理空数组元素
AO3官网镜像链接 Archive of Our Own同人文在线浏览
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
反效果?《战地6》免费试玩开启后玩家数不升反降
AO3最新官网入口公告_2025AO3镜像站实时查询方法
大象笔记网页版入口 印象笔记网页版登录入口
Eclipse怎么运行工程_Eclipse工程运行配置说明


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