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 正則表達(dá)式對象的標(biāo)志字符串
? ? ? ? // 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;
}