引用数据类型之深浅拷贝篇----不得不说的秘密

今天我们说一下数据类型里面的一个小知识点哦!在 JavaScript 中有两种数据类型,分别是 简单数据类型/基本数据类型 和 引用数据类型。

简单数据类型/基本数据类型 :布尔类型、数值类型、字符串类型、null、undefind

引用数据类型:数组、函数和对象

 

         基本数据类型
            赋值的是 存储的数据
            赋值之后 两个变量没有关系

         引用数据类型
            浅拷贝
               直接赋值 赋值的是 内存地址
               赋值之后 两个变量使用的相同内容,一个操作,另一个也会改变
            深拷贝
               循环遍历,获取引用数据类型中,存储的每一个数据信息
               赋值到新的变量中
               赋值之后 两个变量,没有任何关系

大家发现没有,我们的 浅拷贝和深拷贝 只有引用数据类型才有哦!😝😝😝

 

简单数据类型/基本数据类型

首先我们现说一下基本类型数据的

        // 简单数据类型/基本数据类型

        // 此时 str1 中存储的是 数据 北京
        var str1 = '北京';

        // 将 str1 中存储的数据北京 赋值给 str2 
        var str2 = str1;

        // 之后对str1 的操作,与str2,无关
        str1 = '上海';

        console.log(str1 , str2);

代码的显示图:

 

有没有发现,有没有发现,有没有发现,重要的事情说三遍🙃🙃🙃!当我们的 str2 被赋值以 str1 后,在对 str1 进行操作时,将在不对 str2 尽行影响。

引用数据类型

浅拷贝

接下来我们先看一个实列讲解

        // arr1 变量中 存储的是 数组的 内存地址
        var arr1 = [1,2,3,4,5];

        // 将arr1 存储的内存地址,赋值给arr2,两个变量存储的是相同的内存地址
        var arr2 = arr1;

        // arr1操作,数组,arr2也会改变
        // 因为arr1和arr2,同时存储的是相同的数据,操作的也是同一个数组
        // 同理,arr2,操作数组,arr1也会改变
        arr1[0] = '北京';

        console.log(arr2);

        // 直接将一个引用数据类型的地址,赋值给另一个变量存储的,称为浅拷贝
        // 两个变量存储的是相同的内存地址,一个操作,另一个也会改变

代码显示图:

看见没?因为 浅拷贝 时,两个数组是共用的一个地址,所以,当我们对这两个中的任何一个数组进行操作时,另外一个都会受到影响。通俗一点儿讲:

 

有两户人家,分别是 A 户,B 户;他们两家合资打了一口井,两家共用,假如其中一户人家
对这口 井 做点儿什么😈😈😈,那是不是它们两家都要受到影响呢?
在这里,井 就是我们数组的 储存地址哦!

深拷贝

下面是实例讲解时间:

        // 只复制arr3中的数据
        var arr3 = ['北京','上海','广州','重庆','天津'];

        // 循环遍历,获取arr3中的所有数据数值,赋值到新的数组中
        var arr4 = [];

        // 通过循环,生成arr3的所有索引下标
        for(var i = 0 ; i <= arr3.length-1 ; i++){
            // arr3[i] 就是获取 arr3中的 存储的 数据信息
            // arr4.push() 将arr3中的数据 arr3[i] , 写入到 arr4中
            arr4.push(arr3[i]);
        }

        console.log(arr4);

        arr3[0] = '武汉';

        console.log(arr3 , arr4);

         不想两个变量操作数组,都会改变,想建立一个独立的变量,只是存储相同的数据
         需要建立一个独立的变量,复制引用数据类型中的数据内容

         只复制 引用数据类型中的 数值 而不是 复制地址
         称为 深拷贝

代码显示图:

其中第一个输出的数组是深拷贝后的数组;

中间的那个数组有一个后面又执行了一个赋值操作,根据我们深拷贝的原理,两个数组拷贝完成后,谁不影响谁,就是 各回各家,各找各妈。

 

扩展

引用数据类型存放在堆中,栈中存放的是堆中的引用地址。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值