新闻中心
J*aScript深拷贝与浅拷贝的几种方式_j*ascript技巧
浅拷贝只复制对象第一层属性,深层仍共享引用;深拷贝递归复制所有层级,完全断开引用。常用浅拷贝方法有Object.assign()、扩展运算符、slice()/concat();深拷贝可使用JSON.parse(JSON.stringify())(有限制)、递归实现、structuredClone()或Lodash的cloneDeep()。示例表明浅拷贝修改嵌套属性会影响原对象,而深拷贝不会。手动实现深拷贝需处理对象、数组、基本类型及特殊类型,但简单递归未解决循环引用,生产环境推荐成熟库。选择方式应根据数据类型、性能需求和兼容性综合考虑。

J*aScript中的深拷贝和浅拷贝主要针对引用类型(如对象、数组)在赋值时的行为差异。浅拷贝只复制对象的第一层属性,深层嵌套仍共享同一引用;而深拷贝会递归复制所有层级,完全断开引用关系。下面介绍几种常见的实现方式。
浅拷贝的常用方法
浅拷贝适用于只需复制第一层属性的场景,修改嵌套属性时仍会影响原对象。
- Object.assign():将源对象的所有可枚举属性复制到目标对象。注意仅复制一层。
- 扩展运算符 {...} :语法简洁,常用于对象或数组的浅复制。
- Array.prototype.slice() / concat():适用于数组,生成新数组但不深拷贝内部元素。
示例:
// 对象浅拷贝const obj1 = { a: 1, b: { c: 2 } };
const obj2 = Object.assign({}, obj1);
obj2.b.c = 3;
console.log(obj1.b.c); // 输出 3,说明是浅拷贝
深拷贝的基本方法
深拷贝能彻底隔离新旧对象,适合复杂嵌套结构。
- JSON.parse(JSON.stringify()):最简单的方法,但有局限性,无法处理函数、undefined、Symbol、循环引用等。
- 递归实现深拷贝:手动遍历对象属性,对引用类型递归调用拷贝函数,可控性强。
- 使用结构化克隆算法(Structured Clone):部分浏览器支持,如 structuredClone(),支持多数数据类型。
- 第三方库(如 Lodash):提供成熟的 _.cloneDeep() 方法,兼容性好。
示例:JSON方式
BrandCrowd
一个在线Logo免费设计生成器
200
查看详情
const obj1 = { a: 1, b: { c: 2 } };const obj2 = JSON.parse(JSON.stringify(obj1));
obj2.b.c = 3;
console.log(obj1.b.c); // 输出 2,成功深拷贝
手动实现一个简易深拷贝函数
通过类型判断和递归,可以处理大多数情况。
function deepClone(obj) {if (obj === null || typeof obj !== 'object') return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof Array) return obj.map(item => deepClone(item));
if (typeof obj === 'object') {
const cloned = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
cloned[key] = deepClone(obj[key]);
}
}
return cloned;
}
}
这个版本能处理对象、数组、基本类型和嵌套结构,但未解决循环引用问题。生产环境建议使用成熟库。
注意事项与适用场景
选择拷贝方式需结合实际需求。
- 若对象不含函数、日期、Symbol 等特殊类型,JSON方法最快捷。
- 需要完整支持各种类型时,推荐使用 Lodash 的 cloneDeep。
- 频繁操作且性能敏感,可考虑优化的递归实现或 structuredClone(现代浏览器)。
- 注意循环引用会导致递归爆栈或JSON报错,需额外检测。
基本上就这些,理解原理后可根据项目需求灵活选择。
以上就是J*aScript深拷贝与浅拷贝的几种方式_j*ascript技巧的详细内容,更多请关注其它相关文章!
# 扁平化
# seo优化页面不符
# 网站扁平结构优化策略
# 外贸网站推广收费多少合理
# 建湖seo优化品牌
# 口红关键词排名
# 选服务好的网站建设
# 广西地理网站建设项目
# 韶山网站建设免费咨询
# 网站推广方案文档
# 花桥花桥企业网站建设
# 推荐使用
# 只需
# 遍历
# 拷贝
# 适用于
# 第一层
# 运算符
# 如何实现
# 几种
# 递归
# red
# 栈
# 浏览器
# json
# js
# java
# javascript
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色
DLsite中文平台入口 DLsite官网内容在线查看
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】
漫蛙2正版漫画站 漫蛙2网页版快速访问入口
飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】
如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率
谷歌推RCS信息存档功能:公司可监控员工私密信息!
漫蛙2在线漫画入口 漫蛙正版漫画网页版直达
AO3最新官网入口公告_2025AO3镜像站实时查询方法
C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图
Go语言中JSON数据解码与字段访问指南
uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页
Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】
必由学官方网站入口 必由学学生教师共用登录通道
MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令
谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问
Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
Composer如何在生产环境安全地执行composer update
在J*aScript中复现SciPy的B样条拟合与求值:关键考量
新手怎么开始学化妆 零基础化妆入门教程
Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧
在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析
零跑汽车11月交付量达70327台 实现连续9个月正增长
PDF文件体积过大处理_PDF压缩技巧详解
html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】
Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组
在Go Martini框架中高效服务动态生成图像的实践指南
MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具
漫蛙漫画网页端入口 漫蛙2官方正版漫画站点
Typer应用中灵活处理命令行参数的令牌化与解析
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法
机器学习中对数变换预测结果的反向还原
C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果
Win11怎么开启省电模式_Win11电池节电模式自动开启
b站怎么删除评论_b站评论管理与删除操作
fishbowl官网免费版 fishbowl养鱼网站入口
CSS子选择器:如何区分并样式化嵌套列表的子层级
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
响应式容器内容自动缩放与宽高比维持教程
高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法
深入理解Google Cloud Datastore查询:祖先路径与数据一致性
Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性
整合Supabase认证与Django模型:跨模式迁移的解决方案
c++ dfs和bfs代码 c++深度广度优先搜索算法
GemBox Document HTML转PDF垂直文本渲染问题及解决方案


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