代码
function deepClone(obj) {
if(obj == null) {
return null
}
if(typeof obj != 'object') {
return obj
}
if(obj instanceof RegExp || obj instanceof Date) {
return obj
}
if(obj.constructor != 'Array' && obj.constructor != 'Object') {
return obj
}
let cloneObj = (obj instanceof Array) ? [] : {}
for(let item in obj) {
cloneObj[item] = deepClone(obj[item])
}
return cloneObj
}
测试
一般对象
const beforeClone = {
name: 'aolyu',
age: 18,
like: {
eat: 'eat',
sleep: 'sleep'
},
sports: [
'pingpong',
'run'
]
}
const afterClone = deepClone(beforeClone)
console.log('before:', beforeClone)
console.log(' after:', afterClone)

数组
const like = {eat: 'eat', sleep: 'sleep'}
const beforeClone = [1, 2, like]
const afterClone = deepClone(beforeClone)
console.log('before:', beforeClone)
console.log(' after:', afterClone)

RegExp对象
const beforeClone = new RegExp('[0-9]')
const afterClone = deepClone(beforeClone)
console.log('before:', beforeClone)
console.log(' after:', afterClone)

Date对象
const beforeClone = new Date()
const afterClone = deepClone(beforeClone)
console.log('before:', beforeClone)
console.log(' after:', afterClone)

Null
const beforeClone = null
const afterClone = deepClone(beforeClone)
console.log('before:', beforeClone)
console.log(' after:', afterClone)

包装类
const beforeClone = new Number('1')
const afterClone = deepClone(beforeClone)
console.log('before:', beforeClone)
console.log(' after:', afterClone)

自定义函数对象
function TestFunc(name) {
this.name = name
}
const beforeClone = new TestFunc('aolyu')
const afterClone = deepClone(beforeClone)
console.log('before:', beforeClone)
console.log(' after:', afterClone)
