1.如果是函數(shù)類型和普通類型直接返回原來的值。
2.如果是正則括授,直接返回原來的值坞笙。
3.如果是日期類型,直接返回原來的值荚虚。
4.需要新建一個WeakMap的表用來存儲被拷貝過的值薛夜,并且在遞歸的時候傳下去,這樣可以避免對象引用自己造成無限遞歸版述。
5.拷貝的時候只拷貝對象的私有屬性梯澜。
//deepClone
const deepClone = (value, hash = new WeakMap) => {
if(value == null){ // 這里排除掉null 和 undefine 因為null == undefine
return false
}
if(typeof value !== 'object') return value // 這里包含了函數(shù)類型
if(value instanceof RegExp) return new RegExp(value)
if(value instanceof Date) return new Date(value)
// 根據(jù)當(dāng)前屬性構(gòu)造一個新的實例
let instance = new value.constructor
// 這里做一下防止循環(huán)引用的處理
if(hash.has(value)){
return hash.get(value)
}
hash.set(value, instance) // 已經(jīng)拷貝過的存放在表里作為記錄
for (const key in value) {
if (value.hasOwnProperty(key)) { // 只拷貝私有屬性
instance[key] = deepClone(value[key], hash) // 這里表向下傳遞作為記錄
}
}
return instance
}
// test
let obj = {
name: 'teacc',
age: 25,
other:{
a: 1
}
}
obj.b = obj
let cloneObj = deepClone(obj)
cloneObj.other.a = 2
console.log(obj)