读懂【浅拷贝】

本文探讨了JavaScript中对象直接赋值与浅拷贝的行为差异。直接赋值会使两个对象共享同一内存地址,而浅拷贝在修改简单类型属性时不影响原对象,但复杂数据类型的引用会相互影响。
摘要由CSDN通过智能技术生成

1、对象直接赋值

先来看一下,创建一个对象obj(原对象),将对象obj直接赋值给另一个对象o(新对象),修改新对象o中的属性值,会发生什么?-----原来的对象obj内容也被改掉了。

const obj = {name: 'lili'}
const o = obj
o.name = 'yaya'
console.log(o) //  {name: 'yaya'}
console.log(obj) //  {name: 'yaya'}

 

总结:对象o和obj会指向同一个地址,修改其中一个,另一个也会被改变
 

2、浅拷贝有两种方式

2.1 浅拷贝方式一

示例代码如下,创建一个对象obj(原对象),创建一个对象o(新对象), 将对象obj解构到对象o。修改新对象o中的属性值,会发生什么?-----原来的对象obj内容没有被覆盖。

const obj = {name: 'lili'}
const o ={...obj}
o.name = 'yaya'
console.log(o) //  {name: 'yaya'}
console.log(obj) //  {name: 'lili'}

总结:经过浅拷贝后更改新对象o的属性值,不会影响原对象。前提是对于单层结构的对象,对象的属性name的值为字符串这种简单类型。

2.2 浅拷贝方式二

示例代码如下:创建一个复杂对象obj(原对象),创建一个空对象o(新对象)

通过Object.assign(newObj, oldObj)语法执行浅拷贝,修改拷贝后的新对象的属性值,会发生什么?

  <script>
    // 浅拷贝方式二
    // 1、创建一个复杂对象,即对象内部添加了一个family属性,该属性又是一个对象
    const obj = {
      name: 'lili',
      family:{
        baby: '小明'
      }
    }
    // 2、创建一个新对象,为空对象
    const o ={}
    // 3、浅拷贝 Object.assign(新对象, 老对象)
    Object.assign(o, obj)

    // 4、分别修改简单类型值和复杂数据类型的值
    o.name = 'yaya' // 修改简单类型不影响
    o.family.baby = '小莉' // 修改引用类型

    // 5、打印查看结果
    console.log(o) //  {name: 'yaya', family:{ baby: '小莉'  }}
    console.log(obj) //  {name: 'lili', family:{  baby: '小莉'}}

  </script>

查看效果:

总结:修改拷贝后的对象的简单数据name,值更改后不影响原对象;

修改拷贝后的对象的引用数据类型family,内容更改后原对象也被更改了;

这是因为浅拷贝简单的数据类型拷贝的是值,浅拷贝复杂的数据类型拷贝的是地址

所以,浅拷贝只适合单层数据,深层数据拷贝时,修改其中一个数据会影响原来的数据

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值