zoukankan      html  css  js  c++  java
  • 基本类型和引用类型_深拷贝和浅拷贝

    ECMAScript 变量 __ 包含 _____ 的值:
    A.只能;一种数据类型
    B.可能;两种不同数据类型
    C.可能;三种不同数据类型

    (答案见文末)

    定义:

      按值访问:

        Undefined、Null、Boolean、Number、String这五种基本数据类型是按值访问的,因为可以操作保存在变量中实际的值。

      按引用访问:

        var obj = {name : 'Diana'};

        要访问对象,须通过obj这个引用(指针)去寻找这个对象。

      按值传递:

        传递的是值的拷贝,也就是说传递后就互不相关了。

      按引用传递:

        传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。

      

    基本类型的复制:

      var a = 5;
    
      var b = a;
    
      b = 6;
    
      console.log(a); //5


    引用类型的复制:

      var obj_a = {
        name:'Diana'
      };
    
      var obj_b = obj_a;
    
      obj_b.name = 'Apollo';
    
      console.log(obj_a.name); // 'Apollo'


    造成以上结果的原因:

      引用类型的变量,包含的是指针(引用)。当var obj_b = obj_a时,两个变量为指向同一对象的指针(引用)。

      所以当obj_b.name = 'Apollo'时,操作的实际上是两个变量共同指向的那个对象。

      

    -----------------------------------------------------------------分割线-------------------------------------------------------------------------------

    那么,作为函数的参数,基本类型和引用类型是如何表现的呢?

      答:ECMAScript中所有的函数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。

      疑问:如果参数使用的是对象呢。也是按值传递吗?

      答:是的,只不过这个"值" 是 指针。

    深拷贝VS浅拷贝:

      按值访问的数据类型,在拷贝的时候会完整复制一份,拷贝之后就互不相关了。

      按引用访问的数据类型,在拷贝的时候复制的是引用,当原对象发生变化时,拷贝对象也会发生变化。


    let obj1 = { a: 1, b: 2}; let obj2 = { ...obj1, b: '2-edited'}; console.log(obj1); // {a: 1, b: 2} console.log(obj2); // {a: 1, b: "2-edited"}

      由以上代码可以看出,...运算符对基本数据类型复制之后,改变拷贝对象,不会对原对象造成影响

    let obj1 = {a:1, b:{name:'Diana'}};
    let obj2 = {...obj1};
    
    
    obj2.a = 2;
    obj2.b.name = 'Apollo';
    
    console.log(obj1); 
    //{ a: 1, b: { name: 'Apollo' } }
    console.log(obj2); 
    //{ a: 2, b: { name: 'Apollo' } }

      由以上代码可以看出,拷贝后的对象,修改其name属性,对原对象也会由影响。

      由此可以发现,...运算符是一种浅拷贝。

      由上图可见,...运算符在复制对象时,是对象的引用(指针) 。而基本类型,本来就是复制的值。

     拓展:

    function rarr(){
        return [1,2,{name:'diana'}];
    }
    
    
    var copy0 = [...rarr()];
    
    var copy = [...rarr()];
    
    
    copy[2].name = 'applo';
    
    console.log(copy0); //[ 1, 2, { name: 'diana' } ]


    /////////////////////////////////////////////////////////////////

      var a = [1,2,{name:'diana'}];

      var copy0 = a;

      var copy = a;

      copy[2].name = 'appolo';

      console.log(copy0); //[1,2,{name:'appolo'}]

     

    正确答案:B



  • 相关阅读:
    二分查找法的实现和应用汇总
    hdu 3062 Party 2SAT入门
    network monitor 抓包软件 微软的 架构师提供的
    富文本编辑器
    分享图标
    js日期时间控件
    jquery form
    javascript学习站
    sql生成model类
    PHP学习
  • 原文地址:https://www.cnblogs.com/oy-lee/p/11668671.html
Copyright © 2011-2022 走看看