JS中深拷贝浅拷贝的区别

深浅拷贝在MDN官方中的表述是这样的:
对象的深拷贝是指其属性与其拷贝的源对象的属性不共享相同的引用(指向相同的底层值)的副本。因此,当你更改源或副本时,可以确保不会导致其他对象也发生更改;也就是说,你不会无意中对源或副本造成意料之外的更改。这种行为与浅拷贝的行为形成对比,在浅拷贝中,对源或副本的更改可能也会导致其他对象的更改(因为两个对象共享相同的引用)。
对象的浅拷贝是其属性与拷贝源对象的属性共享相同引用(指向相同的底层值)的副本。因此,当你更改源或副本时,也可能导致其他对象也发生更改——也就是说,你可能会无意中对源或副本造成意料之外的更改。这种行为与深拷贝的行为形成对比,在深拷贝中,源和副本是完全独立的。
简单来说,深拷贝是指将对象的属性和方法都拷贝一份,然后存储到另外一个地址,这样的话,无论你怎么修改原对象,拷贝之后的值都不会改变的
在这里插入图片描述

而浅拷贝是仅拷贝一份原函数的地址,传给调用函数。这样的话,调用的对象还是原对象的地址存放的值,故在修改对象方法或属性时会改变原对象。
在这里插入图片描述

学过C语言的都知道函数当中有两种调用参数方式,分别是传值调用引用调用它和深浅拷贝有异曲同工之妙,其中,传值调用是将原来对象的值传递给新的对象,将值拷贝一份,这样就有两份值,分别指向拷贝前后的对象,无论拷贝之后的值如何修改,都不会改被拷贝对象的值。在此与深拷贝相同。
而引用调用是将原来对象的值不变,将值的地址拷贝一份传给新的对象。这样新的对象也可以调用值,但是如果做出修改,原对象的值也会发生改变。因为两个对象的值存放地址是同一个。
在函数调用中,值调用方式将实参的值传给形参,下面所定义的函数foo为值调用方式,函数g的第一个参数采用值调用,第二个参数采用引用调用方式传递数据。若有表达式y=foo(2),则foo调用执行之后,y被赋值为 7

foo(int x)
int b = x - 1;
g(x,b);
return b + x;
g(int b, int &x)
b = b + 1;
x = 2 * b - x;
return;

因为第二个函数是引用调用,所以返回的值将foo()函数中的值也改变了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值