教你如何识别和实现深拷贝与浅拷贝

浅拷贝只是拷贝一层, 更深层次对象级别的只拷贝引用.

【情形一】for循环

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        for (var k in obj) {
            // k 是属性名   obj[k] 属性值
            o[k] = obj[k];
        }
        console.log(o); 
        //o拷贝了obj的msg引用
        console.log(obj); 
        console.log('--------------');

在这里插入图片描述

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        for (var k in obj) {
            // k 是属性名   obj[k] 属性值
            o[k] = obj[k];
        }
        console.log(o); 
        //o拷贝了obj的msg引用
        console.log(obj); 
		o.msg.age = 20; //这里换成obj.msg.age = 20;道理一样,引用值互相影响
        console.log('--------------');

在这里插入图片描述

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        for (var k in obj) {
            // k 是属性名   obj[k] 属性值
            o[k] = obj[k];
        }
        console.log(o); 
        o.msg.age = 20;
        //o拷贝了obj的msg引用
        console.log(obj); 
        console.log('--------------');

在这里插入图片描述

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        for (var k in obj) {
            // k 是属性名   obj[k] 属性值
            o[k] = obj[k];
        }
        console.log(o); 
        o.id=2;
        o.name="leon";
        //o.msg.age = 20;
        //o拷贝了obj的msg引用
        console.log(obj); 
        console.log('--------------');

在这里插入图片描述

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        for (var k in obj) {
            // k 是属性名   obj[k] 属性值
            o[k] = obj[k];
        }
        o.id=2;
        o.name="leon";
        console.log(o); 
        
        //o.msg.age = 20;
        //o拷贝了obj的msg引用
        console.log(obj); 
        console.log('--------------');

在这里插入图片描述

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        for (var k in obj) {
            // k 是属性名   obj[k] 属性值
            o[k] = obj[k];
        }
        obj.id=2;
        obj.name="leon";
        console.log(o); 
        
        //o.msg.age = 20;
        //o拷贝了obj的msg引用
        console.log(obj); 
        console.log('--------------');

在这里插入图片描述

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        for (var k in obj) {
            // k 是属性名   obj[k] 属性值
            o[k] = obj[k];
        }
        
        console.log(o); 
        
        //o.msg.age = 20;
        //o拷贝了obj的msg引用
        console.log(obj); 
        obj.id=2;
        obj.name="leon";
        console.log('--------------');

在这里插入图片描述
一定得好好注意里面的细节。对于浅拷贝来说,原始值原样复制,修改其中一方原始值不影响另外一方;更深层次的引用类型只复制引用,修改引用会互相影响。

【情形二】o=obj

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        
       	console.log('--------------'); 
        o=obj
        console.log(o);//
        o.msg.age = 20;//
        console.log(obj);//

在这里插入图片描述

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        
       	console.log('--------------'); 
       	//o整个复制了对obj的引用
        o=obj
        console.log(o);//
        
        console.log(obj);//
        obj.msg.age = 20;//

在这里插入图片描述

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        
       	console.log('--------------'); 
       	//o整个复制了对obj的引用
        o=obj
        console.log(o);//
        
        console.log(obj);//
        obj.id=2   //o.id=2同理
        obj.name="leon"  //o.name="leon"同理

在这里插入图片描述

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        
       	console.log('--------------'); 
       	//o整个复制了对obj的整个引用
        o=obj
        console.log(o);//
        
        o.id=2
        o.name="leon"
        
        console.log(obj);//

在这里插入图片描述
o=obj,相当于是将obj整个一层看作整体的引用,将整个对象类型的引用完整复制给了o。因此其中的任何数据修改都会互相影响。

【情形三】Object.assign(o, obj)

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        
       	console.log('--------------');
        Object.assign(o, obj)
        
        console.log(o);//
        
        o.msg.age = 20;//
        
        console.log(obj);//

在这里插入图片描述

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        
       	console.log('--------------');
        Object.assign(o, obj)
        
        console.log(o);//
        
        console.log(obj);//
        obj.msg.age = 20;//

在这里插入图片描述

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        
       	console.log('--------------');
        Object.assign(o, obj)
        
        console.log(o);//
        
        o.id=2
        o.name="leon"
        
        console.log(obj);//

在这里插入图片描述

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
        var o = {};
        
       	console.log('--------------');
        Object.assign(o, obj)
        
        console.log(o);//
        
        console.log(obj);//
        obj.id=2
        obj.name="leon"

在这里插入图片描述
对于Object.assign(o, obj)来说,属于浅拷贝,只拷贝一层,更深层次对象级别的只拷贝引用。

深拷贝拷贝多层, 每一级别的数据都会拷贝。

深拷贝的实现(递归的方式)

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            },
            color: ['pink', 'red']
        };  //old

        var o = {};  //new
// -------------------------------------------------
        // 封装函数 
        function deepCopy(newobj, oldobj) {
            for (var k in oldobj) {
                // 判断我们的属性值属于那种数据类型
                // 1. 获取属性值  oldobj[k]
                var item = oldobj[k];

                // 2. 判断这个值是否是数组
                if (item instanceof Array) {
                    newobj[k] = [];
                    deepCopy(newobj[k], item)
                } else if (item instanceof Object) {

                    // 3. 判断这个值是否是对象
                    newobj[k] = {};
                    deepCopy(newobj[k], item)
                } else {
    // 4. 属于简单数据类型(number string null undefined boolean)
                    newobj[k] = item;
                }

            }
        }
        
        deepCopy(o, obj);  //将后者拷贝给前者
        
        console.log(o);//  age 20
// ------------------------------------------
        var arr = [];
        console.log(arr instanceof Object);   //true**********
        //console.log(arr instanceof Array);   //true**********

        o.msg.age = 20;//
        
        console.log(obj);  //拷贝前后两个对象互不影响干扰  age 18

在这里插入图片描述

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            },
            color: ['pink', 'red']
        };  //old

        var o = {};  //new
// -------------------------------------------------
        // 封装函数 (递归实现)
        function deepCopy(newobj, oldobj) {
            for (var k in oldobj) {
                // 判断我们的属性值属于那种数据类型
                // 1. 获取属性值  oldobj[k]
                var item = oldobj[k];

                // 2. 判断这个值是否是数组
                if (item instanceof Array) {
                    newobj[k] = [];
                    deepCopy(newobj[k], item)
                } else if (item instanceof Object) {

                    // 3. 判断这个值是否是对象
                    newobj[k] = {};
                    deepCopy(newobj[k], item)
                } else {
    // 4. 属于简单数据类型(number string null undefined boolean)
                    newobj[k] = item;
                }

            }
        }
        
        deepCopy(o, obj);  //将后者拷贝给前者
        
        //obj.msg.age = 20;//都是下图结果,因为在此之前,obj已经深拷贝给了o,
        //此后的修改互不影响。
        console.log(o);//
// ------------------------------------------
        var arr = [];
        console.log(arr instanceof Object);   //true**********
        //console.log(arr instanceof Array);   //true**********

        obj.msg.age = 20;//
        
        console.log(obj);  //拷贝前后两个对象互不影响干扰 
        //obj.msg.age = 20;//都是下图结果

在这里插入图片描述
对于简单基本数据类型的原始值,更是不会相互影响。

		var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            },
            color: ['pink', 'red']
        };  //old

        var o = {};  //new
// -------------------------------------------------
        // 封装函数 (递归实现)
        function deepCopy(newobj, oldobj) {
            for (var k in oldobj) {
                // 判断我们的属性值属于那种数据类型
                // 1. 获取属性值  oldobj[k]
                var item = oldobj[k];

                // 2. 判断这个值是否是数组
                if (item instanceof Array) {
                    newobj[k] = [];
                    deepCopy(newobj[k], item)
                } else if (item instanceof Object) {

                    // 3. 判断这个值是否是对象
                    newobj[k] = {};
                    deepCopy(newobj[k], item)
                } else {
    // 4. 属于简单数据类型(number string null undefined boolean)
                    newobj[k] = item;
                }

            }
        }
        
        deepCopy(o, obj);  //将后者拷贝给前者
        
        //******此后的修改互不影响。******
        console.log(o);//
// ------------------------------------------
        var arr = [];
        console.log(arr instanceof Object);   //true**********
        //console.log(arr instanceof Array);   //true**********
        
        console.log(obj);  //拷贝前后两个对象互不影响干扰 
        obj.id = 20;

在这里插入图片描述
将obj深拷贝给了o之后,此后的任何数据的修改都不会相互影响。

关于深拷贝与浅拷贝的相关实现介绍到这,若有帮助,烦请留个赞~ ^ _ ^,一起进步学习。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值