js之深浅拷贝与内存地址的关系

数据类型:

简单数据类型

  • 直接存储在栈中

复杂数据类型

  • 指针在栈中,真实的数据存储在堆中(复杂数据类型首先会寻找存在栈中的指针对象,再而找到该指针指向的堆中数据)

深拷贝和浅拷贝只影响复杂数据类型 Object Array

浅拷贝:赋值指针,但是指针同时指向堆中相同的地址,所有会改变原来的数据

比如有一个保险柜里面有两万块钱(堆中的数据),只有A有钥匙(栈中的指针),但是A和B关系很好,A又配了一把钥匙(栈中的指针),A和B都有开启保险柜的钥匙(指针对象),B拿走了一万块钱(修改了堆中的数据),A再去看的时候就只有一万块钱了(看到了变化后的数据),这就是浅拷贝。

  //浅拷贝
        let arr =[{
            name:'苹果',
            price:18
        },{
            name:'香蕉',
            price:17
        },{
            name:'石榴',
            price:16
        },{
            name:'核桃',
            price:15
        },{
            name:'橘子',
            price:14
        }]
        let arr2 = arr; //赋值
        //arr数组的第二项price会变成18
        arr2[1].price = 18;
        console.log(arr,'arr')

å¨è¿éæå¥å¾çæè¿°

深拷贝:直接将堆中的数据重新拷贝了一份,放到了一个新的地址空间,互不影响。
A在银行存了两万块钱(堆中的数据),有一把属于自己的钥匙(栈中的指针),B按照A的流程自己也在银行存了两万块钱(堆中的数据),拥有自己的钥匙(栈中的指针),钥匙不同,保险柜不同,这就是深拷贝。

        //深拷贝
        let arr =[{
            name:'苹果',
            price:18
        },{
            name:'香蕉',
            price:17
        },{
            name:'石榴',
            price:16
        },{
            name:'核桃',
            price:15
        },{
            name:'橘子',
            price:14
        }]
        let arr3 = JSON.parse(JSON.stringify(arr)) //转成字符串 再转成数组对象
        arr3[1]['price'] = 666
        console.log(arr,'arr')  //原数组对象不改变
        console.log(arr3,'arr3') //深拷贝出来的对象改变

å¨è¿éæå¥å¾çæè¿°

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值