主要需要解决的问题:
- 输入:基本数据类型、对象、函数
- 循环引用问题:a引用了b,b引用了c,c引用了a,那c.a还需要深拷贝吗
- 缓存什么时候清空问题:缓存优化
var deepClone = function(obj,cache = []){
if(typeof obj !== 'object' && obj !== null) return obj
if(cache.includes(obj)) return obj
else cache.push(obj)
let cloneObj = Array.isArray(obj) ? [] : {}
for (const key in obj) {
if (Object.hasOwnProperty.call(obj, key)) {
const el = obj[key];
switch(Object.prototype.toString().call(obj)){
case '[Object object]':
cloneObj[key] = deepClone(el,cache)
break;
case '[Array array]':
cloneObj[key] = el.map(item=>deepClone(item,cache)) || []
break;
default :
cloneObj[key] = el
}
}
}
}