1 递归
function deepClone(obj) {
var objClone = Array.isArray(obj) ? [] : {}
if (obj && typeof obj === 'object' && obj != null) {
// 判断obj存在并且是对象类型的时候 因为null也是object类型,所以要单独做判断
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
// 判断obj中是否存在key属性
if (obj[key] && typeof obj[key] === 'object') {
// 判断如果obj[key]存在并且obj[key]是对象类型的时候应该深拷贝,即在堆内存中开辟新的内存
objClone[key] = deepClone(obj[key])
} else {
// 否则就是浅复制
objClone[key] = obj[key]
}
}
}
}
return objClone
}
2JSON.parse(JSON.stringify)
对于一般常用的数据拷贝是可以的,但是遇到复杂的数据,比如date,正则,函数,值为undefinde的对象时,键值对直接被删除,就会出现问题
const clone=JSON.parse(JSON.stringify(obj))
let obj={
name: 'a',
arr:[1,2,3],
date: [new Date(1536627600000), new Date(1540047600000)],
RegExp: new RegExp('\\w+'),
job:undefined
}
let newObj=JSON.parse(JSON.stringify(obj));
newObj.name='lily';
console.log({obj,newObj})
1. RegExp: /\w+/
obj:
1. arr: (3) [1, 2, 3]
1. date: (2) [Tue Sep 11 2018 09:00:00 GMT+0800 (中国标准时间), Sat Oct 20 2018 23:00:00 GMT+0800 (中国标准时间)]
1. job: undefined
1. name: "a"
newObj:
1. RegExp: {}
1. arr: (3) [1, 2, 3]
1. date: (2) ['2018-09-11T01:00:00.000Z', '2018-10-20T15:00:00.000Z']
1. name: "lily"
日期格式变为字符串了
正则变成了空对象,
值为undefinde的键值对直接被删除