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

本文详细解释了JavaScript中深拷贝和浅拷贝的概念,并通过实例展示了它们的区别。浅拷贝仅复制指针,导致原始数据与副本共享同一堆内存,而深拷贝则创建数据的全新副本,确保修改副本不会影响原始数据。通过`JSON.parse(JSON.stringify())`方法可以实现对象的深拷贝。

数据类型:

简单数据类型

  • 直接存储在栈中

复杂数据类型

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

深拷贝和浅拷贝只影响复杂数据类型 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') //深拷贝出来的对象改变

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值