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

关于JS浅拷贝和深拷贝的理解

  • 基础类型和引用类型

  • 基础类型:存储在栈中,直接复制值,因此修改一个变量不会影响另一个变量。
  • 引用类型:存储在堆中,栈中存储引用地址,浅拷贝会复制引用地址,因此修改一个对象的属性会影响另一个对象。

浅拷贝

浅拷贝的基本概念

  1. 基本数据类型

    • 如果属性是基本数据类型,浅拷贝会直接复制这些值。
    • 例如,let a = 1; let b = a;b 是 a 的副本,修改 b 不会影响 a
  2. 引用类型

    • 如果属性是引用类型(如对象、数组),浅拷贝会复制引用地址。
    • 例如,let obj1 = { name: '张三' }; let obj2 = obj1;obj2 和 obj1 引用同一个对象,修改 obj2 的属性会影响 obj1
  3. 浅拷贝的方法:
    • Object.assign(target,source),它有两个特性
        let oldObj = {
          name: '张三',
          age: {
            value: 18,
          },
        }
        const newObj = Object.create(oldObj)
        newObj.ownProperty = 'ownProperty'
        let obj = {}
        Object.assign(obj, newObj)
        // 它不会拷贝对象的继承属性
        console.log('====================================')
        console.log(obj, newObj)
        console.log('====================================')

      let oldObj = {
          name: '张三',
          age: {
            value: 18,
          },
        }
        Object.defineProperty(oldObj, 'nonEnumableProperty', {
          value: 'I am non-enumerable',
          enumerable: false,
        })
        const newObj = Object.create(oldObj)
        newObj.ownProperty = 'ownProperty'
        let obj = {}
        Object.assign(obj, oldObj)
        // 它不会拷贝对象的不可枚举的属性
        console.log('====================================')
        console.log(obj, oldObj)
        console.log('====================================')

    • 扩展运算符、slice方法、concat方法

        let oldObj = {
          name: '张三',
          age: {
            value: 18,
          },
        }
        let newObj = { ...oldObj }
        console.log('====================================')
        console.log(newObj, oldObj)
        console.log('====================================')
        // 数组的浅拷贝
        let arr = [1, 2, 3]
        let newArr1 = [...arr]
        let newArr2 = arr.slice()
        let newArr3 = arr.concat()
        console.log('====================================')
        console.log(arr, newArr1, newArr2, newArr3)
        console.log('====================================')
    • 手写实现浅拷贝
      export function shallowClone(params) {
        if (typeof params === 'object' && params !== null) {
          let newObj = Array.isArray(params) ? [] : {}
          // 遍历对象的所有可枚举属性包括继承的属性
          for (let key in params) {
            // 过滤掉继承的属性,只复制对象自身的属性
            if (params.hasOwnProperty(key)) {
              newObj[key] = params[key]
            }
          }
          return newObj
        } else {
          return params
        }
      }

深拷贝

深拷贝(Deep Copy) 是指创建一个新对象或数组,并递归地将原对象或数组中的所有属性和嵌套对象或数组也复制到新对象或数组中。深拷贝后,新对象或数组与原对象或数组完全独立,修改新对象或数组不会影响原对象或数组,反之亦然。

主要特点

  1. 独立性

    • 深拷贝创建的新对象或数组与原对象或数组完全独立,互不影响。
    • 修改新对象或数组中的任何嵌套对象或数组不会影响原对象或数组。
  2. 递归复制

    • 深拷贝会递归地复制所有嵌套的对象和数组。
    • 无论嵌套层级有多深,都会被完全复制。
  3. 处理复杂数据结构

    • 深拷贝能够处理包含复杂数据结构的对象或数组,如嵌套的对象、数组、函数、日期对象、正则表达式等。

实现深拷贝的方法

  1. 使用 JSON.parse(JSON.stringify(obj),优点:简单易用。缺点:无法处理函数、undefinedSymbolDate 对象、RegExp 对象等。

      let oldObj = {
        name: '张三',
        age: {
          value: 18,
        },
      }
      let newObj = JSON.parse(JSON.stringify(oldObj))
      newObj.age.value = 20
      console.log('====================================')
      console.log(oldObj, newObj)
      console.log('====================================')

        2. 


http://www.kler.cn/a/513281.html

相关文章:

  • uniapp(小程序、app、微信公众号、H5)预览下载文件(pdf)
  • 玉米植物结构受乙烯生物合成基因 ZmACS7 的调控
  • Oracle 深入学习 Part 14:Managing Password Security and Resources(管理密码安全性和资源)
  • OneFlow的简单介绍
  • 财务RPA就是财务机器人吗?有什么作用
  • Wi-Fi 7、Wi-Fi 6 与 5G、4G 的全方位对比
  • Axial Attention in Multidimensional Transformers参考文献翻译
  • 算法-键盘行
  • 分布式系统通信解决方案:Netty Marshalling 全面解析
  • Flutter:carousel_slider 横向轮播图、垂直轮播公告栏实现
  • IP属地:是身份证还是手机归属地?
  • C#,入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程
  • 基于注解实现去重表消息防止重复消费
  • JMeter + Grafana +InfluxDB性能监控
  • 第17章 安全培训筑牢梦想根基
  • 洛谷P8837
  • csapp笔记——2.2节整数表示
  • 智能仓储管理:从自动化到智能化的演进与挑战
  • leetcode:511. 游戏玩法分析 I
  • 数据结构详解——排序
  • 学会与人交谈
  • fpga系列 HDL:Quartus II SignalTap的Create Signal Tap List File功能
  • bundletool来特定设备规范的json安装aab包
  • 微服务学习-Gateway 统一微服务入口
  • Vue.js 什么是 Vue Router
  • 力扣707题——设计链表