深浅拷贝的区别?实现深拷贝的方法

本文详细解释了深拷贝和浅拷贝的概念及其区别,并提供了两种实现深拷贝的方法:递归实现深拷贝和利用JSON的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

!!!这里所说的深浅拷贝前提是引用数据类型

深浅拷贝的主要区别就是:是否真正获取一个对象的复制实体,而不是引用

假设B复制了A,修改A的时候,看B是否发生变化:

如果B跟着也变了,说明是浅拷贝,说明A和B的地址一样的,通过A的修改根本上修改的时A与B地址上的值。

如果B没有改变,说明是深拷贝,即A与B代表的是不同的地址,修改一个另一个不会改变!

  • 浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。(负值时只需要直接将变量等于给另一个变量即可,浅复制只会将对象的各个属性进行复制)
  • 深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。

!!!使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。 

实现深拷贝的方法:

1.递归实现深拷贝:

    <script>
        let obj = {
            name: 'zw',
            number: [10, 20],
            fn: function () {
                console.log(123);
            },
            old: {
                one: '1',
                two: "2"
            }
        }
        // 说明一个函数
        function copy(obj) {
            var newobj = null;
            //通过typeof判断是否为引用数据类型且不等于null
            //如果等于null直接返回newobj
            if (typeof (obj) === 'object' && obj !== null) {
                newobj = obj instanceof Array ? [] : {}//这里创建一个新的引用数据类型用以合并和存放解析后的数据
                //newobj = obj.isArray(obj)?[]:{};
                for (const key in obj) {
                    newobj[key] = copy(obj[key])//递归实现对每一个引用数据类型解析并赋值给一个新创建的引用数据类型
                }
            }
            else {
                newobj = obj;//当解析到基本数据类型时即可以直接赋值。
            }
            return newobj;
        }
        let a = new copy(obj)
        a.number[0] = 555
        console.log(obj);
        console.log(a);
    </script>

核心思想:引用数据类型是有基本数据类型构成的,并且,基本数据类型是不存在深浅拷贝这一说的,那么我们只需要将引用数据类型的每一层次的基本数据类型赋值,并遍历到最深处的基本数据并赋值就可以完成深拷贝。

 2.通过JSON的方法

const a = JSON.parse(JSON.stringify(数据))
//JSON.stringify(需要拷贝数据)转化为JSON字符串
//JSON.parse(JSON字符串) 将JSON数据格式的字符串转化为对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值