最近在回顾以前写的项目,发现很多地方需要对数组等对象进行深拷贝,以前数组用slice用的多,昨晚睡觉时怀疑slice只能拷贝一层,今天试下了,果然是一层,emmm,瞬间感觉再这样写下去会出现问题,于是简单写了下深拷贝的方法。
其他实现的方法很多 比如:JSON.parse(JSON.stringify(arr)) 、 Object.assign(target, ...resouce) 等等, 但是缺点也很明显(如第一种只能拷贝数组和普通对象,对函数等等无法转换成为json的类型 转换之后就消失了;而第二种只能拷贝一层,这和slice一个样啊),但胜在简单易用。 这里主要用的常见的递归实现,多层级也不怕了
function deepClone(obj) {
let newObj = null
if (Array.isArray(obj)) {
newObj = []
} else if (obj instanceof Object) {
newObj = {}
} else {
return obj
}
for(let i in obj) {
if (obj[i] instanceof RegExp || obj[i] instanceof Date) {
newObj[i] = obj[i]
} else if (typeof obj[i] === 'object') {
newObj[i] = deepClone(obj[i])
} else {
newObj[i] = obj[i]
}
}
return newObj
}
附上一个例子
let arr = [
{
name: 'chen',
id: 1,
fn(){
console.log('haha')
},
person: {
country: {
name: 'China',
area: '960万平方公里'
}
}
},
{
name: 'xing',
id: 2,
reg: new RegExp(123, 'g')
},
{
name: 'bo',
id: 3,
time: new Date()
}
]
let newArr = deepClone(arr)
newArr[0].id = 10
newArr[1].reg = /abc/i
newArr[2].time = new Date(0)
newArr[0].person.country.strong = true
console.log(newArr)
console.log(arr)