JS深浅拷贝

JavaScript中有两种数据类型:值类型和引用类型。值类型存储在栈内存,引用类型存储在堆内存。浅拷贝复制对象的引用,改变新变量会影响源变量;深拷贝复制所有值,新对象和源对象互不影响。深拷贝可通过JSON.parse(JSON.stringify(obj))或递归函数实现,但前者有局限性。
摘要由CSDN通过智能技术生成

✨为什么会有两种拷贝方式

JavaScript中有两种不同的数据类型,分别是值类型(基本类型)引用数据类型(对象类型)

值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol。
引用数据类型(对象类型):对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。

⌛ Js的基本类型都存在栈内存中,这是因为基本类型的值大小固定,所以它们可以直接存储在变量所在的栈上。每当创建一个变量时,就会在栈内存中为该变量分配内存空间。当变量不再被需要时,这段内存空间也会被释放,以便其他变量可以使用它。

⌛ 相对的Js的引用类型的值存在堆内存中,而栈内存中只存储了该值的引用或指针。这是因为它们的大小是可变的,需要动态地在堆内存中为它们分配和回收空间。无法直接存储在变量所在的栈上。

⌛所以引用类型进行拷贝时,会出现两种情况: 深拷贝和浅拷贝,而深拷贝和浅拷贝主要区别在于拷贝后的对象与原对象是否是同一对象(即是否是引用相同)

✨浅拷贝:
  • 浅拷贝只是复制对象的引用,而不是对象本身。这意味着新变量只是源变量的一个副本,但是它们指向同一个对象内存地址。因此,改变新变量中的值将会影响到源变量,反之亦然。
  • 浅拷贝的实现方式有 Object.assign() 和展开运算符(…),直接=号赋值
✨深拷贝:
  • 深拷贝可以将对象及其嵌套对象的所有值都复制到一个新的对象里面,所以新对象和源对象互不影响。也就是在堆内存中开辟新的内存空间
  • 深拷贝的实现方式
    • JSON.parse(JSON.stringify(obj)) 进行深度复制 (不能处理 undefined、函数和循环引用等特殊情况)
    • 使用递归函数实现深拷贝(要考虑性能问题)
    /**
     * 深拷贝
     * @param {object}}
     * @returns {object}
     * **/
    function deepClone(obj) {
      // 首先判断要复制的是对象还是数组
      let clone = Array.isArray(obj) ? [] : {};
      
      // 遍历 obj,将其属性赋值到 clone 对象中
      for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
          // 如果属性是一个对象,则递归调用
          if (typeof obj[key] === 'object' && obj[key] !== null) {
            clone[key] = deepClone(obj[key]);
          } else {
            clone[key] = obj[key];
          }
        }
      }
      return clone;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗松鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值