JavaScript深拷贝与浅拷贝

深拷贝与浅拷贝的区别:

浅拷贝是新增了一个指针指向原来对象的地址(此时原来的指针和后来拷贝新增的指针都指向原来的指针指向的地址),改变拷贝来的对象的属性,原来的对象相应属性也会随之改变;而深拷贝不仅新增了一个指针,还开辟了一个新的内存空间来存储拷贝来的对象(此时原来的指针还是指向原来的地址,而新增的指针指向新开辟的地址),改变拷贝来的对象的属性,原来的对象相应的属性不会改变。

浅拷贝:

  1. 基本数据类型的值拷贝 --- 当拷贝的数据类型为基本数据类型时,属于浅拷贝,且只拷贝值,当我们改变拷贝的值(b)时,被拷贝的值(a)不发生改变。基本数据类型包括:Number、String、Boolean、Null、undefined、Symbol、bigInt
  2. 对象类型的地址拷贝 --- 当拷贝的数据类型为对象类型时,拷贝的是该对象的地址,当改变拷贝后的对象的值时,被拷贝的对象也会发生改变

           

改变被拷贝的值后:star2.song改变了,star1.song也改变了

        

 深拷贝:

  1. 第一种方法:(最笨的方法)

     

     改变被拷贝的值后:star2.song改变了,star1.song没有改变

     

  2.Object.assign()方法:如果有嵌套的情况下(大括号套着大括号{{}}),只能深拷贝一层,一般在没有嵌套的时候使用:

 

如果有嵌套的情况:                    

     

 

3.转成JSON格式(不怕嵌套):json.stringify(star1),将star1转为字符串格式,赋值给star2,再json.parse(star2)将star2转回对象的格式,完成了深拷贝:

4.递归深拷贝:

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习的米

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值