java深拷贝和浅拷贝的区别

深拷贝和浅拷贝的区别

拷贝,一眼看过去,最简单的意思就是复制吧!浅拷贝是只拷贝一层,深层次的对象级别就只拷贝引用。 深拷贝是拷贝多层,每一级别的数据都拷贝出来。也就是说,基本数据类型其实不存在深浅拷贝的问题,只有对象和数组才存在深浅拷贝的问题。

浅拷贝

一般拷贝就是从新赋值。声明个数据直接用另外一个对象赋值。
弊端
当遇到复杂对象的时候,复制的只是对象的指针,并没有重新开辟大的空间进行复制。这时候造成的影响就是对两个指针进行数据操作的时候,操作的是同一个数据内容,相互之间是受影响!

深拷贝

需要连指针到内容都进行复制,两个指针指向两个空间的内容。各自操作已经不受影响。

方法一:
浅拷贝的复制就是直接复制赋值就可以了。
方法二:
Object.assign是ES6的新函数。Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign() 进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。

多层对象的拷贝方式

方法一
通过JSON转换 用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象。但是这种方法也有不少坏处,譬如它会抛弃对象的constructor。也就是深拷贝之后,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object。并且只能处理常见的Number, String, Boolean, Array, 扁平对象等这些能被JSON表示的数据结构。RegExp对象是无法通过这种方式深拷贝。
方法二
递归拷贝
递归拷贝就是将对象逐层解开进行剖析,逐层新建对象,逐层复制,知道最深处的所有简单数据都复制上。但是要注意要注意对象引用对象的情况,会掉入死循环。
方法3
使用Object.create()方法
直接使用var newObj = Object.create(oldObj),可以达到深拷贝的效果。在进行公司VUE项目开发的过程中,由于需要将富文本编辑器抽离成为一个单独的组件,然后将内容的对象传入进去。如果按照传统的vue组件开发的流程,肯定是要接收传入、赋值给本组件、本组件编辑器修改、修改完毕的内容再进行emit外传,然后组件外部接受,进一步处理。但是由于vue组件之间浅拷贝的特性,其实传入的对象修改之后,外部组件直接取值拿到的就是最新的值。
强调文本 强调文本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值