美文网首页
深拷贝和浅拷贝

深拷贝和浅拷贝

作者: 释梦石 | 来源:发表于2020-08-30 22:23 被阅读0次

    概念

    浅拷贝:只拷贝最外面一层的数据;更深层次的对象,只拷贝引用。

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

    浅拷贝

    for...in实现
    for...in浅拷贝
    Object.assgin() 实现

    ES6 中,我们通过 Object.assgin() 可以实现浅拷贝。

    obj2 = Object.assgin(obj2, obj1);
    

    将obj1 拷贝给 obj2。执行完毕后,obj2 的值会被更新。也就是将 obj1 的值追加到 obj2 中。如果对象里的属性名相同,obj2中的属性值会被覆盖

    Object.assign()实现浅拷贝 浅拷贝,返回值可以不用接收

    深拷贝

    深拷贝的实现本质上是对浅拷贝进行递归来实现的

    let obj1 = {
                name: 'zhudzhi',
                age: 28,
                info: {
                    hob: 'test',
                },
            };
            //name属性值会被覆盖
            let obj2 = {
                name: 'newName',
                sex: 'nv'
            };
            obj2 = deepCopy(obj2, obj1);
            //定义一个函数,做浅拷贝
            function deepCopy(obj2,obj1){
                for(let key in obj1){
                    let items = obj1[key];            
                    if(items instanceof Array){
                        // 当key是一个数组时,再次把数组里的值拷贝到obj2[key]里
                        obj2[key] = [];
                        deepCopy(obj2[key],items)
    
                    }else if(items instanceof Object){
                        //当key是一个对象时,再次拷贝
                        obj2[key] = {};
                        deepCopy(obj2,items)
                    }else{
                        //简单数据类型直接拷贝
                        obj2[key] = items;
                    }
                }
                //返回深拷贝的对象
                return obj2;
    
            }
            console.log('obj2:' + JSON.stringify(obj2));
            obj1.name = 'newName';
            console.log('obj1:' + JSON.stringify(obj1));
            console.log('obj2:' + JSON.stringify(obj2));
    

    打印结果:


    image.png

    相关文章

      网友评论

          本文标题:深拷贝和浅拷贝

          本文链接:https://www.haomeiwen.com/subject/oqldjktx.html