浅克隆及深克隆

270 阅读1分钟

对象浅克隆

浅克隆(浅拷贝)只复制【一层】对象的属性,并不包括对象里面的为引用类型的数据

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 存在函数、undefinedDateRegExp,
那么 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
}