Twlig / issuesBlog

MIT License
3 stars 0 forks source link

深拷贝 #90

Open Twlig opened 2 years ago

Twlig commented 2 years ago

浅拷贝与深拷贝

浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。

深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。

实现一个深拷贝函数

function deepClone(source) {
    function clone(source, map){
        if(source !== null && typeof source == 'object') {
            let result = Array.isArray(source) ? [] : {} //对数组的情况进行考虑
            if(map.has(source)) {
                return map.get(source)
            }
            map.set(source, result)
            for(let key in source) {  //实例和原型上的可枚举属性都可以访问
                if(source.hasOwnProperty(key)) {  //只对实例上可枚举的属性进行拷贝
                    result[key] = clone(source[key], map)
                }
            }
            return result
        }else {
            return source
        }
    }
    let map = new WeakMap()  //解决循环引用的问题
    let result = clone(source, map)
    map = null
    return result
}

参考文章: