当前位置:网站首页 > Vue.js开发 > 正文

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



  • 概述:深浅拷贝,都是拷贝对象内的数据到新对象,新旧对象内的数据相同。
  • 在js中,当我们需要,使用某个对象内的数据,但是不想修改原本的对象内的数据内容时,通常会使用深浅拷贝来复制数据,并对新的对象内的数据进行操作。例如在完成修改操作时,我们会首先拿到服务器给我们返回的数据,对于这这些后台给我们的数据,我们不应该直接操作,这样会出现一个问题,就是在修改页面时,点了取消按钮,由于Vue的双向绑定的特性,在视图上也会修改数据,所以为了避免这个问题,我们通常可以采用深拷贝或者浅拷贝的方式来解决。下面分别介绍深拷贝和浅拷贝。
  • Number
  • String
  • Boolean
  • Null
  • undefined
  • Symbol
  • Object
  • 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本
    类型的值,如果属性是引用类型,拷贝的就是内存地址,所以如果其中一个对象改变了这个地址,就会影响到另一
    个对象。
  • 深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影
    响原对象。
  • 前提:针对引用数据类型
  • 当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。
 
  • 浅拷贝:重新在堆中创建内存,拷贝前后对象的基本数据类型互不影响,但拷贝前后对象的引用类型因共享同一块内存,会相互影响。
 
  • 深拷贝:从堆内存中开辟一个新的区域存放新对象,对对象中的子对象进行递归拷贝,拷贝前后的两个对象互相不影响。
 
  • 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等数据类型都不支持
    • 对于它不支持的数据都会直接忽略该属性
 
到此这篇js深拷贝和浅拷贝的区别(js浅拷贝和深拷贝什么时候用)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
                            

版权声明


相关文章:

  • js中深拷贝的方法(js实现深拷贝函数)2025-03-10 09:18:08
  • jsz是哪个明星的缩写(jyz是哪个明星缩写)2025-03-10 09:18:08
  • vue生命周期的钩子函数(vue生命周期钩子函数各阶段特点及可以用来作什么?)2025-03-10 09:18:08
  • 字符串转int js(字符串转int c语言)2025-03-10 09:18:08
  • redhat6.6安装教程(redhat6.7安装教程)2025-03-10 09:18:08
  • kali更换国内源(kali2020.4换源)2025-03-10 09:18:08
  • map转json字符串 转义符(map转json对象 fastjson)2025-03-10 09:18:08
  • Redhat9.2(Redhat9.2 文件同步 带宽限速)2025-03-10 09:18:08
  • vmware12.0密钥(vmware workstation12pro密钥)2025-03-10 09:18:08
  • ubuntu镜像iso怎么安装教程(ubuntu16.04镜像安装教程)2025-03-10 09:18:08
  • 全屏图片