对于原始类型(Number、String、Boolean、null和undefined)及对象中的函数是可以直接通过“=”复制来实现克隆,而对于对象和数组,需要遍历每个元素,若元素为对象和数组,则继续递归遍历,直到元素为原始类型或函数,则直接通过“=”复制。
function deepClone(obj) {
let result
const type = isClass(obj)
if (type === 'Object') {
result = {}
} else if (type === 'Array') {
result = []
} else {
return obj
}
for(var key in obj) {
const val = obj[key]
if(['Object', 'Array'].includes(isClass(val))) {
// 在严格模式下,禁止使用该种办法
// result[key] = arguments.callee(val) //递归
result[key] = deepClone(val)
} else {
result[key] = val
}
}
return result
}
//判断对象类型
function isClass(obj) {
// Object.prototype.toString.call(obj) [object '类型']
return Object.prototype.toString.call(obj).slice(8, -1)
}