深拷贝和浅拷贝 直接懂了!!!

    // 基本数据类型赋值都是深拷贝  因为都是拷贝的栈地址   数据都是互不影响的

    // 相反  引用类型的数据  直接赋值  拷贝的是栈里面的堆地址  数据相互影响 这就是浅拷贝

    // 那么怎么实现引用数据类型的深拷贝呢:需要开辟新的栈地址  存储 数据  就可以了

 // 第一种情况

    // 1.一维数组和没有嵌套的对象 也就是没有嵌套的数组和对象

        //  直接使用展开运算符

        let a  = [1,2,3];
        let b = [...a];
        a[0] = 9
        console.log(a,b)   

 已经实现深拷贝 数据互不影响

注意:展开运算符只能实现一层拷贝,多层嵌套不行  看下面例子

    let a = [1,2,[7,8,9]]
    let b = [...a]
    a[2][0] = 9
    console.log(a,b) 

 数据是相互影响的  此时 是一个浅拷贝的状态

    //第二种情况

    //2.数组嵌套和对象嵌套

    let a = [1,2,[7,8,9]]
    let b = JSON.parse(JSON.stringify(a))
    a[2][0] = 9
    console.log(a,b)  

 此时 已经实现深拷贝 数据互不影响

注意:此方法无法拷贝对象  看下面例子

    let a = {
        name:'111',
        say(){
            console.log(this.name);
        }
    }
    let b = JSON.parse(JSON.stringify(a))
    console.log(a,b);
    

 

    //第三种情况

    // 对象 数组 函数  全部都实现深拷贝   :递归

    let a = {
        name:'111',
        age:[15,18],
        say(){
            console.log(this.name);
        }
    }
    let b = deepClone(a)
    function deepClone(oldData){
        //判断数据是对象还是数组   把null除去
        if(typeof oldData === 'Object' && oldData !== null){
            //RES接收数据或者对象
            let  res = Array.isArray(oldData)?[]:{};
            for(let k in  oldData){
                if(oldData.hasOwnProperty(k)){
                    //这里就是递归  如果是多层嵌套  再次调用deepClone  直到全部赋值完毕
                    res[k] = deepClone(oldData)
                }
            }
            return 
        }
        else{
            return oldData
        }
    }
    console.log(a,b);

 这里更改任何a里面的数据都是不会影响b的   没有举例子修改  大家可以自己试一试的哈

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值