深拷贝

function checkType(obj) {

    return Object.prototype.toString.call(obj).slice(8,-1);

}

function deepClone(obj,hash = new WeakMap()) {

    if(checkType(obj) === 'Date') {

        return new Date(obj)

    }

    if(checkType(obj) === 'RegExp') {

        // regExp.source 正则对象的源模式文本

        // regEpx.flags 正则表达式对象的标志字符串

        // regEpx.lastIndex 下次匹配开始的字符串索引位置

        let temp = new RegExp(obj.source,obj.flags);

        temp.lastIndex = obj.lastIndex;

        return temp;

    }

    if(obj === null || typeof obj !=='object') {

        return obj

    }

    if(hash.has(obj)){

        return hash.get(obj);

    }

    let newObj = new obj.constructor

    hash.set(obj, newObj);

    Reflect.ownKeys(obj).forEach(key => {

        if(typeof obj[key] === 'object' && obj[key] !== nll) {

            newObj[key] = deepClone(obj[key], hash);

        } else {

            newObj[key] = obj[key];

            Object.defineProperty(newObj, key, Object.getOwnPropertyDescriptor(obj, key));

        }

    })

    return newObj;

}

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