思路
- 先判断是否为引用类型,基本类型不需要拷贝,直接返回
- 引用类型分为数组和对象,此方法不考虑函数
- 如果为数组,则创建一个res=[],并使用forEach遍历;
- 如果为对象,则创建一个res={},并使用for in遍历;
- 总之:都是创建一个新的内存空间
- 赋值时应考虑当前项是否为引用类型,因此需要调再次用cloneDeep进行判断

function cloneDeep(target,cache = new Map()) {
if (typeof target !== 'object') {
return target;
}
if(cache.has(target)){
return cache
}
cache.set(target,result);
let res = Array.isArray(target) ? [] : {};
if (Array.isArray(target)) {
target.forEach(function (item, index) {
res.push(cloneDeep(item));
});
} else {
for (var k in target) {
res[k] = cloneDeep(target[k]);
}
}
return res;
}