美文网首页
深度拷贝

深度拷贝

作者: 哑巴湖大水怪吖 | 来源:发表于2022-05-31 11:21 被阅读0次

    在这篇文章看到的,https://mp.weixin.qq.com/s/lCytacvU-EhlO0pxaBz6vA 我只是记录一下,以后用的时候好参考,嗯,只是参考而已,哈哈哈。大佬要是看到啦,希望不要介意。

    Object.getOwnPropertyDescriptors() 方法用来获取一个对象的所有自身属性的描述符。
    返回所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。

    深度克隆(深拷贝)大体可以概括为三种方式:
    1. JSON.stringify+JSON.parse, 这个很好理解;
    2. 全量判断类型,根据类型做不同的处理
    3. 2的变型,简化类型判断过程
    引用数据类型有哪些

    ES6之前:Object, Array, Date, RegExp, Error,
    ES6之后:Map, Set, WeakMap, WeakSet,

    简单粗暴版本
    function deepClone(obj) {
        let res = {};
        // 类型判断的通用方法
        function getType(obj) {
            return Object.prototype.toString.call(obj).replaceAll(new RegExp(/\[|\]|object /g), "");
        }
        const type = getType(obj);
        const reference = ["Set", "WeakSet", "Map", "WeakMap", "RegExp", "Date", "Error"];
        if (type === "Object") {
            for (const key in obj) {
                if (Object.hasOwnProperty.call(obj, key)) {
                    res[key] = deepClone(obj[key]);
                }
            }
        } else if (type === "Array") {
            console.log('array obj', obj);
            obj.forEach((e, i) => {
                res[i] = deepClone(e);
            });
        }
    // 优化段开始
        else if (type === "Date") {
            res = new Date(obj);
        } else if (type === "RegExp") {
            res = new RegExp(obj);
        } else if (type === "Map") {
            res = new Map(obj);
        } else if (type === "Set") {
            res = new Set(obj);
        } else if (type === "WeakMap") {
            res = new WeakMap(obj);
        } else if (type === "WeakSet") {
            res = new WeakSet(obj);
        }else if (type === "Error") {
            res = new Error(obj);
        }
         else {
            res = obj;
    //   优化段结束      
    
        // 上面简单优化可为下方这样 =》
        else if (reference.includes(type)) {
            res = new obj.constructor(obj);
        } else {
            res = obj;
        }
        return res;
    
    
    
        }
        return res;
    
    大神的方法
    function deepClone(obj, hash = new WeakMap()) {
        if (hash.has(obj)) {
            return obj;
        }
        let res = null;
        const reference = [Date, RegExp, Set, WeakSet, Map, WeakMap, Error];
    
        if (reference.includes(obj?.constructor)) {
            res = new obj.constructor(obj);
        } else if (Array.isArray(obj)) {
            res = [];
            obj.forEach((e, i) => {
                res[i] = deepClone(e);
            });
        } else if (typeof obj === "object" && obj !== null) {
            res = {};
            for (const key in obj) {
                if (Object.hasOwnProperty.call(obj, key)) {
                    res[key] = deepClone(obj[key]);
                }
            }
            hash.set(obj, res);
        } else {
            res = obj;
        }
        return res;
    }
    

    相关文章

      网友评论

          本文标题:深度拷贝

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