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

JS中对象的浅拷贝,深拷贝和引用

JS中对象的浅拷贝,深拷贝和引用

浅拷贝和深拷贝的区别主要在于它们如何处理引用类型的数据(如数组和对象),而引用简而言之就是换了个变量名。

浅拷贝

  • 引用:浅拷贝只复制对象的第一层属性,对于嵌套的对象或数组,它只复制引用而不是创建新的空间。这样,浅拷贝后的新对象和原对象中的嵌套对象仍然指向同一个内存地址。

  • 方式:可以使用扩展运算符 ...Object.assign() 进行浅拷贝。

  • 示例

    const original = { a: 1, b: { c: 2 } };
    const shallowCopy = { ...original };
    shallowCopy.b.c = 3;
    console.log(original.b.c); // 输出 3
    

深拷贝

  • 创建新的空间:深拷贝会递归地复制对象的每一层属性,对于嵌套的对象或数组,它会创建新的空间存储数据,因此新对象和原对象完全独立。

  • 方式:可以使用 JSON.parse(JSON.stringify())、第三方库如 Lodash 的 _.cloneDeep() 方法,或者手动实现递归拷贝。

    • 使用JSON.parse(JSON.stringify(option))的方式会丢失function方法,导致tooltip中的formatter消失,
    • 引入lodash中的深拷贝来进行复制:
      • import _ from ‘lodash’;
      • let tmpOption = _.cloneDeep(option)
  • 示例

    const original = { a: 1, b: { c: 2 } };
    const deepCopy = JSON.parse(JSON.stringify(original));
    deepCopy.b.c = 3;
    console.log(original.b.c); // 输出 2
    

深浅拷贝区别总结

  • 浅拷贝:只复制一层属性,对于嵌套结构只复制引用。适合处理简单对象,不适用于需要完全独立的数据副本。
  • 深拷贝:递归复制所有层次的属性,完全独立于原对象。适合处理复杂对象和深层嵌套的结构。

引用和浅拷贝

let param1 = this.customInsertInformation;
param1.insertDialogVisible = false;

这里,param1 只是一个对 this.customInsertInformation 的引用。当你修改 param1.insertDialogVisible 的值时,实际上是在修改 this.customInsertInformation 对象的 insertDialogVisible 属性。

这就不同于浅拷贝(使用扩展运算符...),后者会创建一个新的对象,不会影响原始对象的属性。如果你希望在不影响原对象的情况下创建一个新的对象,使用浅拷贝或深拷贝的方法会更合适。

例如:

let param1 = { ...this.customInsertInformation };
param1.insertDialogVisible = false;
// this.customInsertInformation 不会改变
http://www.lryc.cn/news/499114.html

相关文章:

  • 思普企业运营平台 idsCheck Sql注入漏洞复现
  • FSWIND脉动风-风载时程生成器软件下载、安装及注册
  • spring通过RequestContextHolder获取HttpServletRequest对象
  • STM32编码器接口及编码器测速模板代码
  • qt QNetworkAccessManager详解
  • 部署 Vue 前端项目到 Linux
  • 数据分析:探索数据背后的秘密与挑战
  • 文本域设置高度 加上文字限制并show出来:
  • 深入浅出:Gin框架-简介与API开发入门
  • MySQL各种锁详解
  • 海外的bug-hunters,不一样的403bypass
  • React 组件中 State 的定义、使用及正确更新方式
  • Jenkins 的HTTP Request 插件为什么不能配置Basic认证了
  • 8 Bellman Ford算法SPFA
  • nginx不允许静态文件被post请求显示405 not allowed
  • 【c++笔试强训】(第三十二篇)
  • shell脚本实战案例
  • OpenCV-图像阈值
  • lvgl9 Line(lv_line) 控件使用指南
  • 区块链概念 Web 3.0 实操
  • 【人工智能】大数据平台技术及应用
  • Scala的模式匹配(7)
  • 使用 MATLAB 绘制三维散点图:根据坐标和距离映射点的颜色和大小
  • 数仓技术hive与oracle对比(五)
  • 金融数学在股市交易中的具体应用
  • Spring6:1 概述
  • Python Selenium 各浏览器驱动下载与配置使用(详细流程)
  • C语言期末考试——重点考点
  • mongo开启慢日志及常用命令行操作、数据备份
  • Mybatis-Plus的主要API