【JS】深拷贝和浅拷贝的理解

提出问题

在这里插入图片描述问题:在拷贝之后,为什么修改a数组里的数据,b数组也会变?

解决问题

在这里插入图片描述
从这个问题发散开来,我们首先要弄明白的是以下几个知识点,从而弄清楚造成这个问题的原因:

知识点1:js的数据类型和拷贝方式

-基本数据类型引用数据类型
number,string,boolean,null,undefindedobject,array,function
数据存储值存在栈内存中值存在堆内存中,地址存在栈内存中
拷贝拷贝值拷贝指向堆内存的地址
拷贝方式栈内存中开辟新内存,存储变量和值栈内存中开辟新内存存储变量和堆内存的地址,和原拷贝对象指向同一个堆内存中的值
修改是否影响原拷贝对象

如图,对于基本数据类型而言
拷贝前:
在这里插入图片描述
拷贝后:

在这里插入图片描述
故修改b的值,不会影响a的值

而对于引用数据类型
拷贝前:
在这里插入图片描述
拷贝后:
在这里插入图片描述
故修改d的值会影响到原拷贝对象c,这种拷贝方式其实就是浅拷贝

知识点2:深拷贝和浅拷贝
其实,只有在针对引用数据的拷贝的时候,才会存在浅拷贝的问题,浅拷贝会影响到原拷贝对象的数据安全,故不能通过直接赋值的方式来拷贝。那么,应该怎么拷贝呢?考虑是,只要在堆内存中新开辟一块地方来存值,其实就对原拷贝对象产生不了影响了,所以深拷贝就是,新建了一个对象/数组,然后递归去复制原对象/数组的所有层级属性。
由此封装的深拷贝函数:

    function deepCopy(oldObj) {
        var newObj = {};
        for(var key in oldObj) {
            if(typeof oldObj[key] === 'object') {
                newObj[key] = deepCopy(oldObj[key]);
            }else{
                newObj[key] = oldObj[key];
            }
        }
        return newObj;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值