思路:
1.判断是否为引用类型
2.判断是否为String对象、Number对象以及Bool对象
3.对日期对象做处理
4.区分数组和对象做处理
5.对函数做拷贝
6.还有一些内置类没做处理(如正则,错误等),后续有时间再处理
let deepCopy = function(data = {}){
//string,number,bool,null,undefined,symbol
//object,array,date
if(data&&typeof data==="object"){
//针对函数的拷贝
if(typeof data==="function"){
let tempFunc = data.bind(null)
tempFunc.prototype = deepCopy(data.prototype)
return tempFunc
}
switch(Object.prototype.toString.call(data)){
case "[object String]":return data.toString()
case "[object Number]":return Number(data.toString())
case "[object Boolean]":return new Boolean(data.toString())
case "[object Date]":return new Date(data.getTime())
case "[object Array]":
let arr = []
for(let i=0;i<data.length;i++){
arr[i] = deepCopy(data[i])
}
return arr
//js自带对象或用户自定义类实例
case "[object Object]":
let obj = {}
for(let key in data){
//会遍历原型链上的属性方法,可以用hasOwnProperty来控制 (obj.hasOwnProperty(prop)
obj[key] = deepCopy(data[key])
}
return obj
}
}else{
//string,number,bool,null,undefined,symbol
return data
}
}
测试:
let a = {
hobbits:["sing","dance",{
read:["hlm","shz"],
walk:{
type:"sports",
content:"walk"
},
run:{
type:"sports",
content:"run"
},
}],
b:{
age:10,
c:{
name:"c"
}
}
}
b = deepCopy(a)
console.log(b)
// {
// hobbits:["sing","dance",{
// read:["hlm","shz"],
// walk:{
// type:"sports",
// content:"walk"
// },
// run:{
// type:"sports",
// content:"run"
// },
// }],
// b:{
// age:10,
// c:{
// name:"c"
// }
// }
// }
console.log(a===b) //false
总结主要的点:
1.遍历到对象和数组时,创建对应的类型的空数据
2.像空数据内填充内容
3.返回这个数组或者对象