对象深拷贝与浅拷贝
1、使用JSON方法
缺点:数据类型为undefined和函数时不能进行拷贝
let obj1={
a:1,
b:[1,2,3],
c:undefined,
fun:()=>{}
}
let obj2=JSON.parse(JSON.stringify(obj1))
obj2.a=222
obj2.b[1]=666
console.log(obj1,obj2)
2、使用Object.assign
缺点:只能深拷贝一级属性,二级属性会成为浅拷贝
let obj1={
a:1,
b:[1,2,3],
c:undefined,
fun:()=>{}
}
let obj2=Object.assign({},obj1)
obj2.a=222
obj2.b[1]=666
console.log(obj1,obj2)
3、使用扩展运算符
缺点:只能深拷贝一级属性,二级属性会成为浅拷贝
let obj1={
a:1,
b:[1,2,3],
c:undefined,
fun:()=>{}
}
let obj2={...obj1}
obj2.a=222
obj2.b[1]=666
console.log(obj1,obj2)
4、递归(比较完美解决方案)
function cloneDeep(data){
let newData=Array.isArray(data)?[]:{}
for(let key in data){
if(data[key]&&typeof data[key]==='object'){
newData[key]=cloneDeep(data[key])
}else{
newData[key]=data[key]
}
}
return newData
}
let obj1={
a:1,
b:[1,2,3],
c:undefined,
fun:()=>{}
}
let obj2=cloneDeep(obj1)
obj2.a=222
obj2.b[1]=666
console.log(obj1,obj2)
数组深拷贝与浅拷贝
1、使用JSON方法
缺点:数据类型为undefined和函数时不能进行拷贝。
2、使用Object.assign
缺点:只能深拷贝一级属性,二级属性会成为浅拷贝。
3、使用扩展运算符
缺点:只能深拷贝一级属性,二级属性会成为浅拷贝。
4、slice、concat
缺点:只能深拷贝一级属性,二级属性会成为浅拷贝。
5、递归(比较完美解决方案)