深拷贝
- 代码
function isObject(value) { const valueType = typeof value return (value !== null) && (valueType === 'object' || valueType === 'function') } function deepClone(param, map = new WeakMap()) { // 判断是否是一个Set类型 if (param instanceof Set) { return new Set([...param]) } // 判断是否是一个Map类型 if (param instanceof Map) { return new Map([...param]) } // 判断symbol if (typeof param === 'symbol') { return Symbol(param.description) } // 判断非函数和对象直接返回 if (!isObject(param) || typeof param === 'function') return param // 判断是数组还是对象 // 判断是否存储过newObj (解决循环引用) if (map.has(param)) { return map.get(param) } const newObj = Array.prototype.isPrototypeOf(param) ? [] : {} map.set(param, newObj) for (let key in param) { newObj[key] = deepClone(param[key], map) } // 对symbol的key做特殊处理 const symbolKeys = Object.getOwnPropertySymbols(param) for (const item of symbolKeys) { newObj[item] = deepClone(param[item], map) } return newObj }
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!