JS-15-深拷贝和浅拷贝

1.什么是深拷贝,什么是浅拷贝?

1.1深拷贝
修改新变量的值不会影响原有变量的值;
默认情况下基本数据类型都是深拷贝;

1.2浅拷贝
修改新变量的值会影响原有的变量的值;
默认情况下引用类型都是浅拷贝;

// 深拷贝
        let num1 = 123;
        let num2 = num1;
        num2 = 666; // 修改新变量的值
        console.log(num1); // 123
        console.log(num2); // 666
        
// 浅拷贝
        class Person{
            name = "abc";
            age = 22;
        }
        let p1 = new Person();
        let p2 = p1;
        p2.name = "zs"; // 修改变量的值
        console.log(p1.name); // zs
        console.log(p2.name); // zs

2. assign方法可以将第二个参数的对象的属性和方法拷贝到第一个参数的对象中

例:

     Object.assign(p2, p1);
        // console.log(p2);
     p2.name = "zs";
     console.log(p1.name);
     console.log(p2.name);
     // 注意点: 当只有被拷贝对象中所有属性都是基本数据类型时, 以上代码才是深拷贝
  • 当有对象或数组时(拷贝后会指向同一个原型对象,修改新变量参数同样会影响之前变量的值)(下面方法为真正的深拷贝):
  class Person{
            name = "abc";
            cat = {
                age : 3
            };
            scores = [1, 3, 5];
        }
        
 let p1 = new Person();
 let p2 = new Object();

depCopy(p2, p1);

p2.cat.age = 666;

  console.log(p1.cat.age);
  console.log(p2.cat.age);

function depCopy(target, source) {
                 // 1.通过遍历拿到source中所有的属性
            for(let key in source){
                // console.log(key);
                
                // 2.取出当前遍历到的属性对应的取值
            let sourceValue = source[key];
                // console.log(sourceValue);
                
                // 3.判断当前的取值是否是引用数据类型
            if(sourceValue instanceof Object){
                    // console.log(sourceValue.constructor);
                    // console.log(new sourceValue.constructor);
                 let subTarget = new sourceValue.constructor; // 创建新的原型对象
                 target[key] = subTarget;
                 depCopy(subTarget, sourceValue);

                }else{
                    target[key] = sourceValue;
                }
            }
        }

-End

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值