对象浅克隆
浅克隆(浅拷贝)只复制【一层】对象的属性,并不包括对象里面的为引用类型的数据
1.简单的引用复制
遍历对象的最外层属性,把属性值复制到另外一个对象中
for(let key in obj){
if(obj.hasOwnProperty(key)) res[key] = obj[key]
}
2.使用Object.assign()
var obj2 = Object.assign({},obj1)
3.扩展运算符
var obj2 = [...obj1]
4.数组静态方法 Array.from
var obj2 = Array.from(obj1)
5.数组的 slice 和 concat 方法
6.loadash的clone
对象深克隆
深拷贝是对对象以及对象的所有子对象进行拷贝
方法1:JSON 序列化
let obj2 = JSON.parse(JSON.stringify(obj1))
存在问题:如果 克隆对象中的 value 存在函数、undefined、Date、RegExp,
那么 JSON 序列化的结果就会丢失、转化成另一个格式的内容等结果,原因是 JSON 不支持这些数据类型。
方法2:loadash的cloneDeep
方法3:手写深拷贝
//深拷贝-简易写法
function copyData(data) {
//如果不是数组和方法则进行相应的返回
if(data === null) return data
if(data instanceof Date) return new Date(data)
if(data instanceof RegExp) return new RegExp(data)
if(typeof data !== 'object') return data
let newDate = Array.isArray(data)?[]:{}//判断是数组还是方法
Object.keys(data).forEach(key=>{//遍历内部属性
//如果内部还是引用类型则递归
newDate[key] = (typeof data[key] === 'object' ) ? copyData(data[key]) : data[key]
})
return newDate
}