搜 索

JavaScript深浅拷贝

  • 384阅读
  • 2022年03月15日
  • 0评论
首页 / JS高级 / 正文

浅拷贝

浅拷贝实现思路:直接将值遍历给需要拷贝的对象。

    <script>
        let obj = {
            uname: '刘宇阳',
            sex: '男',
            asg: {
                a: 1,
                b: 2
            },
            arr: ['刘', '宇', '阳']
        }

        let o = {};

        function deepCopy(o, obj) {
            for (let k in obj) {
                o[k] = obj[k];
            }
        }

        deepCopy(o, obj);
    </script>

甚至简单点也可以直接赋值给它。

    <script>
        let obj = {
            uname: '刘宇阳',
            sex: '男',
            asg: {
                a: 1,
                b: 2
            },
            arr: ['刘', '宇', '阳']
        }

        let o = obj;
    </script>

但是两者不仅值被拷贝了,内存地址也被拷贝了。因为双方是一个内存地址,所以修改任意一方值,双方都会进行改变。

    obj.asg.a = 100;
    console.log(obj.asg.a); //100
    console.log(o.asg.a); //100

    o.asg.a = 100;
    console.log(o.asg.a); //100
    console.log(obj.asg.a); //100


深拷贝

深拷贝实现思路:先创建一个新的内存地址,然后将复杂数据类型存储给新的内存,然后再给它赋值需要拷贝的对象。这样拷贝的对象的值被修改就不会影响到被拷贝的那个对象值。因为两者内存不是一个地址,所以不管修改哪方,对方都不会受到影响。

<script>
    let obj = {
        uname: '刘宇阳',
        sex: '男',
        asg: {
            a: 1,
            b: 2
        },
        arr: ['刘', '宇', '阳']
    }

    let o = {};

    function deepCopy(o, obj) {
        for (let k in obj) {
            let item = obj[k];

            if (obj[k] instanceof Array) {
                o[k] = [];
                deepCopy(o[k], item);
            } else if (obj[k] instanceof Object) {
                o[k] = {};
                deepCopy(o[k], item);
            } else {
                o[k] = item;
            }
        }
    }

    deepCopy(o, obj);

    //两者内存不是一个地址,所以不管修改哪方,对方都不会受到影响
    obj.asg.a = 100;
    console.log(obj.asg.a); //100
    console.log(o.asg.a); //1
</script>

两者内存不是一个地址,所以不管修改哪方,对方都不会受到影响

    obj.asg.a = 100;
    console.log(obj.asg.a); //100
    console.log(o.asg.a); //1


总结

  • 浅拷贝就是复杂数据类型之间的值被拷贝了,修改任意一方值都会被改变
  • 深拷贝就是复杂数据类型直接的值被拷贝了,修改任意一方的值不会影响彼此
  • 需要注意的是简单数据类型不管深浅拷贝内存地址不会被拷贝,修改值不会影响彼此
评论区
暂无评论
avatar