JSON.parse(JSON.stringify(obj)) 实现深拷贝的问题
JSON.parse(JSON.stringify(obj))
生成的对象中,如果原值是一个regExp对象或者Date对象,regExp只会拷贝出{},Date只会拷贝出字符串
let obj = {
a:1,
b: new Date(),
c: /[s]/
}
为了解决这个问题,要书写cloneDeep函数
function cloneDeep(obj) {
let tmpObj
let type = Object.prototype.toString.call(obj)
if (type === '[object Object]') {
tmpObj = {}
for (let i in obj) {
tmpObj[i] = cloneDeep(obj[i])
}
} else if (type === '[object Array]') {
tmpObj = []
for (let i of obj) {
tmpObj.push(cloneDeep(i))
}
} else if (type === '[object regExp]') {
tmpObj = new regExp(obj)
} else if (type === '[object Date]') {
tmpObj = new Date(obj)
} else {
tmpObj = obj
}
return tmpObj
}
let obj = { a: 1, b: 2, c: [1, 2, { f: 1 }], g: new Date(), k: /s/g }
const r = cloneDeep(obj)
console.log(r);
