数组和对象的浅克隆和深克隆

(1)浅克隆只克隆数据/对象的第一层级内容开辟新的堆内存,而第二层及以下的内容则直接引用(使用原来第二层级以下层级的堆内容),如果对其克隆后的对象二层级及以下层级进行修改时,原对象也会跟着被修改。

实现浅克隆

for (let key in obj) {
    if (!obj.hasOwnProperty(key)) break;
    obj1[key] = obj[key]
}

 展开运算符

let obj2 = {
    ...obj1
}

Object.assign()

(2)深克隆:克隆数组或对象的每个层级,不管一个对象或数组有多少层级,那么当我们进行深克隆时每一个层级都会开辟一块新的堆内存地址,克隆后对象/数组的任何层级做任何修改都不会影响到克隆前的对象/数组。

实现深克隆

let obj1 = JSON.parse(JSON.stringify(obj))

注:使用这种方法如果有属性值是正则,函数或者日期格式都会出现问题

正则/Math数学函数会被处理为空对象

具备函数/Symbol/undefined属性值的属性会被直接删除掉

日期对象转换后变为字符串

 

自己封装一个deepclone

function deepClone(obj) {
    // 过滤特殊情况
    if (obj === null) return null
    if (typeof obj !== 'object') return obj
    if (obj instanceof RegExp) {
        return new RegExp(obj)
    } 
    if (obj instanceof Date) {
        return new Date(obj)
    }
    // 不直接创建空对象,克隆的结果和之前保持相同的所属类
    let newObj = new obj.constructor
    for (let key in obj) {
        if(obj.hasOwnProperty(key)) {
            newObj[key] = deepClone(obj[key])
        }
    }
    return newObj 
}

 

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页