深浅拷贝的应用理解

深浅拷贝的应用理解

浅拷贝

主要是针对于引用数据类型
就是对引用数据类型的地址进行引用 复制后的副本,和原来父本。两者如果互相修改内容的会影响

浅拷贝方式:

  1. 简单赋值
  2. 简单遍历
  3. 扩展运算符
  4. assign

简单赋值:

let obj = {
    name:'小明',
    age:99,
    arr:[10,20,90],
    o:{
        name:'小王'
    }
}
//简单赋值
let otherObj = obj
obj.age = 66
console.log('obj',obj); //age:66
console.log('other',otherObj); //age:66

简单遍历:

//简单遍历
let otherObj = {}
for(var key in obj){
    otherObj[key] = obj[key]
}
obj.age = 30
obj.o.name = '小李'
obj.arr[0] = 80
console.log('obj',obj); //obj.o.name:'小李',obj.arr[0]:80
console.log('other',otherObj); //obj.o.name:'小李',obj.arr[0]:80

扩展运算符:

//扩展运算符
let otherObj = {...obj}
obj.age = 30
obj.o.name = '小李'
obj.arr[0] = 80
console.log('obj',obj); //obj.o.name:'小李',obj.arr[0]:80
console.log('other',otherObj); //obj.o.name:'小李',obj.arr[0]:80

assign:

//assign
let otherObj = Object.assign(obj) 
obj.age = 88
console.log('obj',obj); //88
console.log('other',otherObj); //88

深拷贝

单独的开辟空间去另外地方进行存储 ,拷贝后复制后的副本和原来父本完全不会影响

深拷贝方法:

  1. JSON反序列化

缺点:如果json里有 function,undefined,则序列化的结果会把 function,undefined 丢失

  1. 递归深度遍历
  2. lodash插件

JSON反序列化

// json反序列化
let obj = {
    name:'小明',
    age:22,
    arr:[10,20,40],
    a:undefined,
    b:function(){},
    p:{
        name:'小李',
        o:{
            name:'小强',
            j:{
                name:'小文'
            }
        }
    }
}
function cloneDeep(obj){
    return JSON.parse(JSON.stringify(obj))
}
let s1 = cloneDeep(obj)
s1.age = 99 
s1.arr[0] = 90 
obj.p.o.j.name = 'aaaaa'
console.log('obj',obj);
console.log('cloneobj',s1);

递归深度遍历

//递归进行深度遍历
function cloneDeep(origin){
    let cloneObj = Array.isArray(origin) ? [] : {}
    if(cloneObj && typeof origin == 'object'){
        for(var key in origin){
            if(origin[key] && typeof origin[key] == 'object'){
                 cloneObj[key] = cloneDeep(origin[key])
            }else{
                cloneObj[key] = origin[key]
            }
        }
    }
    return cloneObj
}
let s1 = cloneDeep(obj)
s1.name = 'aaa'
s1.arr[0] = 1111
console.log('origin',obj);
console.log('clone',s1);

lodash插件

//lodash
let s1 = _.cloneDeep(obj)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值