JavaScript 浅拷贝、深拷贝
1|0概念
ECMAScript变量包含两种不同数据类型的值:基本数据类型和引用数据类型。
基本数据类型:名值存储在栈内存中;
引用数据类型:名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值。
目前基本数据类型有:Boolean、Null、Undefined、Number、String、Symbol,引用数据类型有:Object、Array、Function、RegExp、Date等
深拷贝与浅拷贝的概念只存在于引用数据类型
2|0浅拷贝
当变量被赋值对象时,两者的值会是同一个引用,其中一方改变,另一方也会相应改变,针对引用类型需要实现数据的拷贝。
用 ... 实现
用 concat 实现
用 Object.assign 实现
用 slice 实现
3|0深拷贝
浅拷贝只能解决第一层的问题,如果接下去的值中还有对象的话,则需要使用深拷贝。
通过 JSON 转换实现
缺点:
- 对于 function、undefined,会丢失这些属性。
- 对于 RegExp、Error 对象,只会得到空对象
- 对于 date 对象,得到的结果是 string,而不是 date 对象
- 对于 NaN、Infinity、-Infinity,会变成 null
- 无法处理循环引用
简单版
- 判断类型是否为原始类型,如果是,无需拷贝,直接返回
- 为避免出现循环引用,拷贝对象时先判断存储空间中是否存在当前对象,如果有就直接返回
- 开辟一个存储空间,来存储当前对象和拷贝对象的对应关系
- 对引用类型递归拷贝直到属性为原始类型
缺点:无法拷贝函数、Map
、Set
、正则等其他类型
VUEX版
- 原理与上一版类似
复杂兼容版
高性能版
__EOF__

本文作者:shmillly959
本文链接:https://www.cnblogs.com/shmillly959/p/13723866.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/shmillly959/p/13723866.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现