思路:
1.判斷是否為引用類型
2.判斷是否為String對(duì)象、Number對(duì)象以及Bool對(duì)象
3.對(duì)日期對(duì)象做處理
4.區(qū)分?jǐn)?shù)組和對(duì)象做處理
5.對(duì)函數(shù)做拷貝
6.還有一些內(nèi)置類沒做處理(如正則,錯(cuò)誤等),后續(xù)有時(shí)間再處理
let deepCopy = function(data = {}){
//string,number,bool,null,undefined,symbol
//object,array,date
if(data&&typeof data==="object"){
//針對(duì)函數(shù)的拷貝
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自帶對(duì)象或用戶自定義類實(shí)例
case "[object Object]":
let obj = {}
for(let key in data){
//會(huì)遍歷原型鏈上的屬性方法,可以用hasOwnProperty來控制 (obj.hasOwnProperty(prop)
obj[key] = deepCopy(data[key])
}
return obj
}
}else{
//string,number,bool,null,undefined,symbol
return data
}
}
測(cè)試:
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
總結(jié)主要的點(diǎn):
1.遍歷到對(duì)象和數(shù)組時(shí)朝卒,創(chuàng)建對(duì)應(yīng)的類型的空數(shù)據(jù)
2.像空數(shù)據(jù)內(nèi)填充內(nèi)容
3.返回這個(gè)數(shù)組或者對(duì)象