前言:
深克隆是前端面试的一个非常基础的知识点,一般要求大家能手写出来,现在分享给大家一下本人自己写的深克隆代码,希望对大家有所帮助!
代码:
const isComplexDataType = obj=> (typeof obj === 'object' && obj !== null);
function deepClone(obj,hash = new WeakMap()){
if(obj.constructor === Date){
return new Date(obj) // 日期对象直接返回一个新的日期对象
}
if(obj.constructor === RegExp){
return new RegExp(obj) //正则对象直接返回一个新的正则对象
}
// 如果循环引用了就用 weakMap 来解决
if(hash.has(obj)){
return hash.get(obj);
}
let allDesc = Object.getOwnPropertyDescriptors(obj);
// 遍历传入参数所有键特性
let cloneObj = Object.create(Object.getPrototypeOf(obj),allDesc);
hash.set(obj,cloneObj);
for(let key of Reflect.ownKeys(obj)){
cloneObj[key] = (isComplexDataType(obj[key]) && typeof obj[key] !== 'function') ? deepClone(obj[key], hash) : obj[key]
}
return cloneObj
}