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

(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 
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值