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;
}