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 }