当前位置: 首页 > 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);

使用场景

需要保留变量状态

存在的问题

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

http://www.lryc.cn/news/372645.html

相关文章:

  • 8个常用的辅助函数!!
  • 服务器数据恢复—OceanStor存储中NAS卷数据丢失如何恢复数据?
  • 54.Python-web框架-Django-免费模板django-datta-able
  • XP系统安装Node.js v8.6.0并搭建Vue2开发环境(项目兼容到Vista的IE9浏览器)
  • redis序列化
  • IOT-Tree 1.7.0实现了一个类似Node-Red的流程功能
  • nc网络收发测试-tcp客户端\TCP服务器\UDP\UDP广播
  • 程序员该有怎么样的职业素养
  • 51交通灯
  • 鸿蒙Arkts上传图片并获取接口返回信息
  • 超文本标记语言(HTML)简介
  • 使用thymeleaf直接渲染字符串
  • Spring Boot整合发送QQ邮箱功能
  • Milvus向量数据库
  • python cls的使用
  • idea中maven下载依赖缓慢解决方法
  • JS 中的各种距离 scrollTop?clientHeight?
  • 继承-进阶-易错点
  • 【图论应用】使用多路图(multigraph)对上海地铁站点图建模,并解决最短路径问题
  • RabbitMQ安装配置,封装工具类,发送消息及监听
  • iOS接入Flutter
  • 【ubuntu】用户添加root权限
  • 设计通用灵活的LabVIEW自动测试系统
  • C# WinForm —— 35 StatusStrip 介绍
  • 如何应对生活中的不确定性:仁者安仁,知者利仁。
  • C#面:请解释C#接口的显式实现有什么意义
  • STM32项目分享:智能窗帘系统
  • 【算法-力扣】72. 编辑距离(动态规划)
  • Spring 系统架构图
  • 同三维T80005EHS-4K60 4K60 HDMI/SDI编码器