浅拷贝与深拷贝

216 阅读1分钟

浅拷贝与深拷贝

浅拷贝:

浅拷贝,其实就是创建一个新的对象,它就是对原始数据的复制,如果是基本数据类型的话,就是复制它的值。
而如果是复杂数据类型的话,拷贝的就是它的地址,
即新的对象与原始的对象共用同一块地址,改变两者任意一方的值,都会影响到另外一方的值。
即简单地只拷贝一层。下面写个代码:
    function shallowClone(obj){
        const newObj = {};
        for( let key in obj){
        if(obj.hasOwnProperty[key])
            newObj[key] = obj[key];
        }
        return newObj
    }

在JavaScript中,能实现浅拷贝的方法:

Object.assign()
Array.prototype.slice()

深拷贝:

深拷贝则是开辟一个新的内存空间,即开辟一个新的栈。
它们的属性完全相同,但是它们对应不同的地址,即改变其中一个的属性,不会影响另一个对象的属性。

在JavaScript中,实现深拷贝的方法:

_.cloneDeep()
JSON.stringify()
手写循环递归实现
下面手写实现一下循环递归:
    function deepClone(obj, hash = new WeakMap()) {
        if (obj === null) return obj; 
        if (obj instanceof RegExp) return new RegExp(obj); 
        if (obj instanceof Date) return new Date(obj);
        if (typeof obj !== "object") return obj;
        if (hash.get(obj)) return hash.get(obj);
            let cloneObj = new obj.constructor(); 
            hash.set(obj, cloneObj);
                for (let key in obj) {
                    if (obj.hasOwnProperty(key)) { 
                        cloneObj[key] = deepClone(obj[key], hash);
                }
            }
        return cloneObj;
    }

区别

浅拷贝和深拷贝它们都是创建出一个新的对象,但是它们的复制行为不一样。
浅拷贝只复制属性指向对象的指针,而不复制对象本身。
新旧对象还是共用同一块内存地址,修改时会互相影响
而深拷贝则创建出一个一模一样的对象,但是不共用内存,修改时不会相互影响。