根据转载文章(
javascript高级篇之实现深拷贝的四种方式 – 掘金
)和评论,总结出下面方法是最优解,能hold住 new date()和undefined等情况
//深拷贝:在堆内存中重新开辟一个存储空间,完全克隆一个一模一样的对象
deepCopy(obj, cache = []) {
if (obj === null || typeof obj != 'object') {
return obj
}
if (Object.prototype.toString.call(obj) === '[object Date]') return new Date(obj)
if (Object.prototype.toString.call(obj) === '[object RegExp]') return new RegExp(obj)
if (Object.prototype.toString.call(obj) === '[object Error]') return new Error(obj)
const item = cache.filter(item => item.origin === obj)[0]
if (item) return item.newObj
const newObj = Array.isArray(obj) ? [] : {}
cache.push({
origin: obj,
newObj
})
Object.keys(obj).forEach(key => {
if (typeof obj[key] == "object") {
newObj[key] = this.deepCopy(obj[key], cache)
} else {
newObj[key] = obj[key]
}
});
return newObj
}