当前位置: 首页 > news >正文

JavaScript 深拷贝和浅拷贝的实现、使用场景和存在的问题

浅拷贝

实现

方式 1(ES 5 语法):

const params = Object.assign({}, state.dataForm)

方式 2(ES 6 语法):

const params = { ...state.dataForm }

使用场景

copy 入参和出参

深拷贝

方式 1(手动实现):

/*** 深拷贝* @param obj*/
export const deepCopy = <T>(obj: T): T => {if (obj === null || typeof obj !== "object") {return obj;}if (Array.isArray(obj)) {const arrCopy = [] as any[];obj.forEach((item, index) => {arrCopy[index] = deepCopy(item);});return arrCopy as any;}const objCopy = {} as { [key: string]: any };Object.keys(obj).forEach((key) => {objCopy[key] = deepCopy((obj as { [key: string]: any })[key]);});return objCopy as T;
};

方式 2(第三方):

yarn add lodashimport cloneDeep from 'lodash/cloneDeep';
const params = cloneDeep(state.dataForm);

使用场景

需要保留变量状态

存在的问题

浅拷贝只会复制对象的第一层属性,对于嵌套的对象或数组,拷贝的仍然是引用而不是值。这样会导致修改浅拷贝对象的嵌套属性时,原对象的相应属性也会被修改。

相关文章:

  • 国产MCU芯片(2):东软MCU概览
  • 股指期货功能
  • Noisee AI – AI音乐影片MV在线生成工具,专门为Suno的好搭子来了~
  • 力扣 SQL题目
  • Memcached:内存缓存的强大引擎及其深度解析
  • java.nio.charset.UnmappableCharacterException
  • 16、架构-可观测性-事件日志详细解析
  • javaWeb项目-springboot+vue人事管理系统功能介绍
  • Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported
  • 3D ToF赋能小米CyberDog 2提升视觉灵敏度
  • 华为OD刷题C卷 - 每日刷题 23(提取字符串中的最长表达式,模拟目录管理功能 - 完整实现)
  • 解决Qt的multimedia库在clion中依赖库补全的问题
  • 认识Linux操作系统
  • 逢3必过报数游戏-第13届蓝桥杯省赛Python真题精选
  • 如何选择合适的 AWS 区域对网站性能和成本?
  • 深入了解以太坊
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 10个确保微服务与容器安全的最佳实践
  • CAP理论的例子讲解
  • windows-nginx-https-本地配置
  • 爱情 北京女病人
  • 前端面试总结(at, md)
  • 如何解决微信端直接跳WAP端
  • 世界上最简单的无等待算法(getAndIncrement)
  • 手写双向链表LinkedList的几个常用功能
  • 小程序开发之路(一)
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 中文输入法与React文本输入框的问题与解决方案
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (转)德国人的记事本
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • **CI中自动类加载的用法总结
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net和jar包windows服务部署
  • .NET运行机制
  • /var/log/cvslog 太大
  • @private @protected @public
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [C/C++] C/C++中数字与字符串之间的转换
  • [C++] vector list 等容器的迭代器失效问题
  • [C++]C++类基本语法
  • [C++]unordered系列关联式容器
  • [CLR via C#]11. 事件
  • [c语言]小课堂 day2