深拷贝
小于 1 分钟
深拷贝
- 判断传入值是否为对象
- 创造一个新对象,迭代传入对象进行赋值
- 对象的value为对象的话,递归调用函数
- 迭代完毕返回这个对象
- 传入非对象直接返回这个值
基础版本
function clone(target){
if(typeof target === 'object'){
const cloneTarget = {}
for(let key in target){
cloneTarget[key] = clone(target[key])
}
return cloneTarget
}else{
return target
}
}
兼容数组
function clone(target){
if(typeof target === 'object'){
// 这里判断是否为数组
const cloneTarget = Array.isArray(target) ? [] : {}
for(let key in target){
cloneTarget[key] = clone(target[key])
}
return cloneTarget
}else{
return target
}
}
循环引用
const target = {
field1: 1,
field2: undefined,
field3: {
child: 'child'
},
field4: [2, 4, 8]
};
target.target = target;
function clone(target, map = new Map()){
if(typeof target === 'object'){
// 这里判断是否为数组
const cloneTarget = Array.isArray(target) ? [] : {}
// 判断是否增加了
if(map.get(target)){
return map.get(target)
}
map.set(target, cloneTarget)
for(let key in target){
// 每次将map传入
cloneTarget[key] = clone(target[key], map)
}
return cloneTarget
}else{
return target
}
}