深拷贝和浅拷贝以及解决方案

159 阅读1分钟

浅拷贝出现的前提:引用类型数据(对象和数组)

深拷贝和浅拷贝:

对象浅拷贝:

1.Json转换方法(开发中常用方法)

缺点:数据类型为function或者数据值为undefined情况下无法复制

2.Object.assign方法

缺点:只能深拷贝一级属性,二级以上属性(引用类型)就是浅拷贝

3.扩展运算符

缺点:只能深拷贝一级属性,二级以上属性(引用类型)就是浅拷贝

4.递归(比较完美的解决方案)

function deepCopy(data){

const newData=Array.isArray(data)?[]:{}

for(let key in data){

// 如果是数组key为index

if(data[key]&& typeof data[key]==="object"){

// typeof 后面不管是数组还是对象,后面的值为object

newData[key]=CloneDeep(data[key])


}else{
newData[key]=data[key]
}
return newData

}

数组的浅拷贝:

1.Json转换方法(开发中常用方法)

缺点:数据类型为function或者数据值为undefined情况下无法复制

2.Object.assign方法

缺点:只能深拷贝一级属性,二级以上属性(引用类型)就是浅拷贝

3.扩展运算符

缺点:只能深拷贝一级属性,二级以上属性(引用类型)就是浅拷贝

4.slice/concat

缺点:只能深拷贝一级属性,二级以上属性(引用类型)就是浅拷贝

5.递归(比较完美的解决方案)

function CloneDeep(data){

const newData=Array.isArray(data)?[]:{}

for(let key in data){

// 如果是数组key为index

if(data[key]&& typeof data[key]==="object"){

// typeof 后面不管是数组还是对象,后面的值为object

newData[key]=CloneDeep(data[key])


}else{
newData[key]=data[key]
}
return newData

}