function isObject(value) {
const valueType = typeof value
return (value !== null) && (valueType === "object" || valueType === "function")
}
function deepClone(originValue) {
// instanceof判断某个对象是否为真实的构造函数类型
// 优化4,判断是否是一个Set类型
if (originValue instanceof Set) {
return new Set([...originValue]);
}
// 优化5,判断是否是一个Map类型
if (originValue instanceof Map) {
return new Map([...originValue]);
}
// 优化3,判断如果是Symbol的value, 那么创建一个新的Symbol
if (typeof originValue === "symbol") {
return Symbol(originValue.description)
}
// 优化2,判断如果是函数类型, 那么直接使用同一个函数
if (typeof originValue === "function") {
return originValue
}
// 判断传入的originValue是否是一个对象类型
// 如果不是对象类型,则直接返回,做一个赋值操作,将旧的值赋值给新的对象
if (!isObject(originValue)) {
return originValue
}
// 优化1,判断传入的对象是数组, 还是对象
const newObject = Array.isArray(originValue) ? []: {}
for (const key in originValue) {
newObject[key] = deepClone(originValue[key])
}
// symbol无法当作key被遍历,所以需要另外处理
// 对Symbol的key进行特殊的处理
const symbolKeys = Object.getOwnPropertySymbols(originValue);
for (const sKey of symbolKeys) {
newObject[sKey] = deepClone(originValue[sKey]);
}
return newObject
}