- 概述:深浅拷贝,都是拷贝对象内的数据到新对象,新旧对象内的数据相同。
- 在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等数据类型都不支持
- 对于它不支持的数据都会直接忽略该属性
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/14075.html