js深拷贝和浅拷贝的区别(js浅拷贝和深拷贝什么时候用)

js深拷贝和浅拷贝的区别(js浅拷贝和深拷贝什么时候用)概述 深浅拷贝 都是拷贝对象内的数据到新对象 新旧对象内的数据相同 在 js 中 当我们需要 使用某个对象内的数据 但是不想修改原本的对象内的数据内容时 通常会使用深浅拷贝来复制数据 并对新的对象内的数据进行操作 例如在完成修改操作时 我们会首先拿到服务器给我们返回的数据 对于这这些后台给我们的数据 我们不应该直接操作 这样会出现一个问题 就是在修改页面时 点了取消按钮 由于 Vue 的双向绑定的特性 在视图上也会修改数据 所以为了避免这个问题 我们通常可以采用深拷贝或者浅拷贝的方式来解决



  • 概述:深浅拷贝,都是拷贝对象内的数据到新对象,新旧对象内的数据相同。
  • 在js中,当我们需要,使用某个对象内的数据,但是不想修改原本的对象内的数据内容时,通常会使用深浅拷贝来复制数据,并对新的对象内的数据进行操作。例如在完成修改操作时,我们会首先拿到服务器给我们返回的数据,对于这这些后台给我们的数据,我们不应该直接操作,这样会出现一个问题,就是在修改页面时,点了取消按钮,由于Vue的双向绑定的特性,在视图上也会修改数据,所以为了避免这个问题,我们通常可以采用深拷贝或者浅拷贝的方式来解决。下面分别介绍深拷贝和浅拷贝。
  • Number
  • String
  • Boolean
  • Null
  • undefined
  • Symbol
  • Object

前面6种类型是简单数据类型,而Object是引用数据类型;简单数据类型没有子类型了,不可以再进行拆分了,而复杂数据类型还有子类型,比如Array,Function,RegExp,Date等对象;正是因为这些子类型的不同导致了深拷贝的各种问题;数据类型的不同,会导致在内存中的存储方式的不同,如果是简单数据类型,存储在栈空间中,存储的是一个值;如果是复杂数据类型,存储在堆空间中,栈空间存储的是一个引用。
正是这种存储方式的差异,导致了浅拷贝和深拷贝的区别。

  • 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本
    类型的值,如果属性是引用类型,拷贝的就是内存地址,所以如果其中一个对象改变了这个地址,就会影响到另一
    个对象。
  • 深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影
    响原对象。
  • 前提:针对引用数据类型
  • 当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。

  • 浅拷贝:重新在堆中创建内存,拷贝前后对象的基本数据类型互不影响,但拷贝前后对象的引用类型因共享同一块内存,会相互影响。

  • 深拷贝:从堆内存中开辟一个新的区域存放新对象,对对象中的子对象进行递归拷贝,拷贝前后的两个对象互相不影响。


  • Object.assign

  • 展开运算符

  • Array.prototype.concat()

  • Array.prototype.slice()


序列化与反序列化

  • 利用JSON.stringify将对象转成JSON字符串,再用JSON.parse把字符串解析成对象
  • 一来一去,新的对象产生了,而且对象会开辟新的栈,实现深拷贝

  • 注意
    • 这种方法虽然可以实现深拷贝,但由于它是依赖于JSON,因此不支持JSON的其他格式
    • JSON只支持object,array,string,number,true,false,null这几种数据或者值,其他的比如函数,undefined,Date,RegExp等数据类型都不支持
    • 对于它不支持的数据都会直接忽略该属性



                    
编程小号
上一篇 2025-02-27 23:51
下一篇 2025-03-26 23:46

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/14075.html