深拷贝和浅拷贝

概念

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

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

浅拷贝

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

你可能感兴趣的:(深拷贝和浅拷贝)