函数设计
功能
递归实现数据的深拷贝
参数
被拷贝的数据
返回值
拷贝完的新数据
思路
1.需要先判断数据类型,主要分为三种,数组类型,对象类型,其他类型
2.对于对象类型和数组类型的,都需要使用递归对其进行深度的拆解,直至成为其余的类型
3.对于其余类型,可以作为函数返回值进行赋值
实现
//这里的深拷贝仅限于常规对象和常规数组
function cloneDeep(value) {
let initVal = null
let valueType = toString.call(value)
switch (valueType) {
case '[object Object]':
initVal = {}
let arrs = Object.keys(value)
if(arrs.length>0){
arrs.forEach((item)=>{
initVal[item] = cloneDeep(value[item])
})
return initVal
}else{
return {}
}
break
case '[object Array]':
let arr = []
if(value.length>0){
value.forEach((item,index)=>{
arr[index] = cloneDeep(item)
})
return arr
}else{
return []
}
break
default:
return value
}
}
测试
<script>
//这里的深拷贝仅限于常规对象和常规数组
function cloneDeep(value) {
let initVal = null
let valueType = toString.call(value)
switch (valueType) {
case '[object Object]':
initVal = {}
let arrs = Object.keys(value)
if(arrs.length>0){
arrs.forEach((item)=>{
initVal[item] = cloneDeep(value[item])
})
return initVal
}else{
return {}
}
break
case '[object Array]':
let arr = []
if(value.length>0){
value.forEach((item,index)=>{
arr[index] = cloneDeep(item)
})
return arr
}else{
return []
}
break
default:
return value
}
}
let family = [
{
name:'王惊涛',
age:27,
love:['吃饭','睡觉','写代码'],
gender:true,
work:{
name:'coder',
love:function(){
console.log('编码')
}
}
},
{
name:'马师',
age:28,
love:['吃饭','吃饭','还是吃饭'],
gender:false,
work:null,
pi:undefined
}
]
let cloneShallow = family
let cloneFamily = cloneDeep(family)
console.log(cloneShallow === family,'浅拷贝')
console.log(cloneFamily === family,'递归深拷贝')
console.log(cloneFamily,'深拷贝后的对象')
</script>