新闻中心
JS深拷贝浅拷贝怎么区分_JS深拷贝与浅拷贝原理与实现方法
浅拷贝只复制对象第一层属性,引用类型共享内存,修改嵌套属性会影响原对象;深拷贝递归复制所有层级,生成完全独立的对象。常见浅拷贝方法有Object.assign()、展开运算符;深拷贝可用JSON.parse(JSON.stringify())或递归实现,后者可处理函数、循环引用等复杂情况。

在J*aScript中,深拷贝和浅拷贝都是用来复制对象的方法,但它们的行为有本质区别。理解两者的原理和实现方式,对处理复杂数据结构非常重要。
什么是浅拷贝?
浅拷贝是指创建一个新对象,这个新对象拥有原对象属性的直接值或引用。如果原对象的属性是基本类型,拷贝的是值;如果是引用类型(如数组、对象),拷贝的是内存地址,也就是说,新旧对象会共享同一块堆内存。
这意味着:修改拷贝后的对象中的引用类型属性,会影响原始对象。
常见实现方式:- Object.assign():只能实现一级属性的浅拷贝
- 展开运算符 {...obj}:同上,只复制第一层
- 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,说明共享引用
什么是深拷贝?
深拷贝会递归地复制对象的所有层级,包括嵌套的对象和数组,生成一个完全独立的新对象。原对象和拷贝对象互不影响。
深拷贝的关键在于:所有引用类型都被重新创建,不共享任何内存。
火龙果写作
用火龙果,轻松写作,通过校对、改写、扩展等功能实现高质量内容生产。
277
查看详情
常见实现方式:
- JSON.parse(JSON.stringify(obj)):简单有效,但有局限性(不能处理函数、undefined、Symbol、循环引用等)
- 递归手动实现:可以控制各种数据类型,更灵活
- 使用第三方库:如 Lodash 的 _.cloneDeep()
示例(JSON方法):
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = JSON.parse(JSON.stringify(obj1));
obj2.b.c = 3;
console.log(obj1.b.c); // 输出 2,互不影响
注意:JSON方法无法处理函数、正则、Date对象可能出错、以及循环引用会报错。
如何手动实现一个简易深拷贝?
通过递归判断数据类型,分别处理对象、数组和其他类型。
function deepClone(obj, visited = new WeakMap()) {
if (obj === null || typeof obj !== 'object') return obj;
// 处理循环引用
if (visited.has(obj)) return visited.get(obj);
let clone;
if (Array.isArray(obj)) {
clone = [];
} else {
clone = {};
}
visited.set(obj, clone);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] =
deepClone(obj[key], visited);
}
}
return clone;
}
这个版本支持循环引用(使用WeakMap),避免无限递归。
浅拷贝与深拷贝的核心区别总结
- 浅拷贝只复制一层,深层仍共用引用
- 深拷贝完全独立,每一层都重新创建
- 性能上:浅拷贝快,深拷贝慢,尤其对象层级深时
- 使用场景:若对象不含嵌套引用,浅拷贝足够;否则建议深拷贝
以上就是JS深拷贝浅拷贝怎么区分_JS深拷贝与浅拷贝原理与实现方法的详细内容,更多请关注其它相关文章!
# javascript
# 定制营销型网站建设
# 松岗推广软件招聘网站
# 医院网站建设价格低
# 怎么用内链优化网站
# 第一层
# 何为
# 绑定
# 表单
# 弹出
# 运算符
# 的是
# 背景色
# 数据结构
# 递归
# 区别
# json
# js
# java
# js完整使用教程
# 跨境电商seo
# seo关键词排名优化价格多少
# 宝鸡网站推广怎么样
# 百度推广营销管培生招聘
# 永宁网站优化哪家靠谱
# 营销经典广告推广语录大全
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
深入理解J*a编译器的兼容性选项:从-source到--release
word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法
解决移动端滚动问题的overflow属性应用指南
PySpark中从现有列右侧提取可变长度字符创建新列的教程
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
微信网页版官方入口教程 微信网页版网页版快速登录步骤
可靠CSGO开箱平台解析 CSGO开箱网合集
j*a toString()的覆盖
微信客户端如何收红包_微信客户端接收红包使用教程
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
composer的"require-dev"部分是用来做什么的?
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明
J*aScript中如何高效提取对象指定属性
C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图
深入理解Google Cloud Datastore查询:祖先路径与数据一致性
Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】
Golang如何使用context实现超时取消_Golang context超时取消模式实践
win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】
C++如何比较两个字符串_C++ string compare函数与操作符对比
C++如何生成随机数_C++ random库使用方法与范围设置
C#使用XPath查询节点时出错? 常见语法错误与调试技巧
Discord Slash 命令响应超时问题的异步解决方案
Lar*el 8 多关键词数据库搜索优化实践
mysql如何设置表访问权限_mysql表访问权限配置
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程
Promise错误处理:在catch后终止链式then执行的策略
C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言
QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录
J*aScript map 迭代中检测空数组元素的有效方法
Typer应用中灵活处理命令行参数的令牌化与解析
J*aScript实现单选按钮与关联输入框的联动禁用教程
字由网在线版登录地址 字由网网页版安全入口
俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达
京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比
UC浏览器网页版登录入口官网 电脑版网址入口
win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】
AO3最新入口2025公告_AO3中文官网合集
基于动态规划的房屋花卉种植最小成本算法详解
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台
Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
在FastAPI中利用lifespan与依赖注入高效管理Redis连接池
Golang并发任务中错误如何聚合_Golang goroutine error收集方式


2025-11-07
浏览次数:次
返回列表
deepClone(obj[key], visited);
}
}
return clone;
}