js浅拷贝和深拷贝

1、基本数据类型拷贝

基本数据类型的拷贝就是通过一个变量赋值给另一个变量的操作

        let a = 1;
        let b = a;

 把a赋值给b之后,再去操作a并不会影响b,因为a和b是两个不同的区域

        let a = 1;
        let b = a;
        a = 5;
        console.log(b);  //输出1
        console.log(a);   //输出5

2、浅拷贝(shallow clone)

        浅拷贝只能拷贝复杂数据类型的指针,并不能改变复杂数据类型的地址,只能拷贝外层,并不能彻底拷贝,例如数组中还有数组(对象),(准确来说是外层引用数据类型)

(1)对象浅拷贝

①依次赋值

优点:数量较少的时候使用方便、简单

缺点:遇到对象或者数组比较多的,操作不方便

        let obj = {
            a: {name: '涛哥'},
            b: 2
        }
        let newObj = {}
        newObj.a=obj.a
        newObj.b=obj.b
        console.log(newObj);
        console.log(obj);

输出结果:

 ②for...in 遍历

        let obj = {
            b: 2,
            a:1
        }
        let newObj = {} 
        
        for (const key in obj) {
            newObj[key]=obj[key]
        }

        obj.b = 1

        console.log(newObj);

遍历obj对象中的每一项,赋值给newObj对象

 ③Object.assign(目标对象,要拷贝的对象)

        let obj = {
            b:2
        }
        let newObj= {}
        // 拷贝给谁 , 拷贝对象
        Object.assign(newObj,obj)
        obj.b = 5
        console.log(newObj);
        console.log(obj.b);
        console.log(newObj.b);

输出:

注: 浅拷贝只能拷贝一层 不能继续拷贝里面的复杂数据类型

 3、深拷贝

不光外层的引用地址该变了 内层的引用数据类型也发生改变

        let obj = {
            b:2,
            hobby:{
                jump:'卷'          //hobby是一个对象
            }
        }

        let newObj= {}
        Object.assign(newObj,obj)
        console.log(newObj);       

        obj.b = 99999         //修改obj里边的b元素的值,newObj中的b元素的值不会改变
        obj.hobby.jump='卷不懂了'  //obj里边的hobby对象赋值'卷不懂了'
        console.log(obj,newObj);

输出:

 (2)JSON.parse(JSON.stringify()) 深拷贝

        let obj = {
            b: 2,
            hobby: {
                jump: '跳'
            }
        }

        let obj4 = JSON.parse(JSON.stringify(obj)) // 深拷贝
        console.log(obj4);

输出:

 了解:

JSON.parse(JSON.stringify())拷贝后的缺陷:

  • NaN          ===》null
  • undefined ===》 空
  • 时间戳      ===》字符串时间
  • 错误信息  ===》 空对象
  • Infinity      ===》null
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值