• JS 基础知识2 传值和传址


    要知道传址跟传址,首先我们先了解下数据值的操作。

    1复制:可以把它赋值给一个新的变量

    2传递:可以将他传递给一个函数或者方法

    3比较:可以与另外一个值比较,判断是否相等

    简要介绍下传值:

    当一个数据是通过值被操作的,那么关系到的是数据的值,在赋值的过程中,是对实际值进行了COPY,储存在一个变量或者属性或数组中,copy的值与原数据是相互独立的。

    当数据通过值传递给一个函数时,数据的一份传递给这个函数,如果函数体修改了这个值,只在函数体受影响,函数外的原数据不受影响。

    当一个数据通过值和另外一个数据做比较,它们是相对独立的存在,仅仅就是值的比较。

    传址:

    原数据只有一份真实的COPY,操作全部都是针对于该值的引用。

    这样的话,在赋值的操作中,只是这个地址被赋值,而不是一个值的COPY,赋值以后,新变量所指的值与原始变量一样。两个地址都是有效的,都可以操作这个值。

    同样在传递的时候也是传递的是这个地址,而不是值,然而在函数内部,通过地址来修改值的本身,在外部同样的改变。

    在比较的时候,它们比较的是引用地址,而不是具体的值,所以就算值相同,还是不相等。

    具体参阅对比表:

     传值传址
    复制 实际复制的是值,存在于两个不同的独立拷贝 复制的只是对数值的引用,即地址,如果通过这个新的引用修改了数值,这个改变对最初的引用也是可见的
    传递 传递给函数的值是一个独立的拷贝,对它的改变函数外没有影响 传递给函数的是对数值的一个引用。如果通过这个新的引用修改了数值,这个改变对最初的引用也是可见的
    比较 比较两个独立的值,判断是否相同 比较的是两个的引用,判断引用是否是同一个数值。对两个不同数值的引用不相等,即使这两个数值相等

    基础类型和引用类型

    基础类型是通过传值来操作,而引用类型则是通过传址来操作的

    数字和布尔类型是基础类型,因为它们是由很小的,固定数目字节组成。

    对象是引用类型。数组和函数,是对象的特殊类型,也是引用类型。由于对象的没有固定大小,所以无法通过传值。

    具体看实例:

    这是一个传值。(基础类型)

     1         var a = 1;
     2         var b = a;            //将a复制给b
     3         function add1(x,y) {     //函数修改参数的值
     4             x = x + y;              //虽然这个里面将值进行相加,但是仅仅是值的独立拷贝,进行相加,在函数外面没有影响
     5         }
     6         add1(a,b);                //数字类型为传值
     7 
     8         alert("a:" + a + "
    " + "b:" + b);      //a为1,b为1  
     9         (a == b) ? c = "true" : c = "false";  
    10         alert(c);         //c="true"

    这是一个传址

     1    var a = ["a", "b", "c", "d"];      //定义数组,引用类型
     2         var b = a;                           //将a复制给b
     3         function add(x) {           //函数修改参数的值
     4             x[0] = "tt";
     5         }
     6         add(b);             //数组对象为传址  
     7         alert("a:" + a[0] + a[1] + a[2] + a[3] + "
    " + "b:" + b[0] + b[1] + b[2] + b[3]);     //b对象修改,则a也会修改,传址
     8       //  (a == b) ? q = "true" : q = "false";    //判断 a=b  ,返回true
     9       //  alert(q);
    10 
    11         var a = ["a", "b", "c", "d"];
    12         var b = ["a", "b", "c", "d"];
    13         (a == b) ? q = "true" : q = "false";     //这里定义了两个对象,虽然值一样,但是不是同样的地址,所以为false
    14         alert(q);    //输出"false"

    需要注意的是,如果函数用新的一个对象或者数组覆盖这个引用,那么这一修改在外部是不可见的。或者说,对象和数组是用传值的方式来传递的,只不过这个值是一个引用,而不是本身。

     1  var a1 = [1, 2, 3];
     2         function add(a, b) {
     3             var newa = Array();
     4             newa[0] = a[0] + b;
     5             newa[1] = a[1] + b;
     6             newa[2] = a[2] + b;
     7             a = newa;     //重新覆盖了引用,所以外部是不可见的
     8             alert(a[0]);  //11
     9         }
    10         add(a1, 10);   
    11         alert(a1[0]);     //1

    字符串类型

    前面看了这么多类型,一直都没有介绍字符串类型,它不好直接分为基础类型和引用类型,因为字符串是一种任意的长度,看上去应该是引用类型,可是他却不是对象,所以也不可作为引用类型。

    类型
    复制
    传递
    比较
    数字 传值 传值 传值
    布尔 传值 传值 传值
    字符串 不可变 不可变 传值
    对象 传址 传址 传址
  • 相关阅读:
    Java 工程名上有个红色叹号
    TestNG 入门教程
    字典序问题
    统计数字问题
    sniffer 简介
    【转】IE浏览器快捷键大全
    批处理 延时不完全总结【转】
    批处理(Batch)---批处理脚本。
    windows系统命令行
    计算机网络
  • 原文地址:https://www.cnblogs.com/joe2014/p/3813919.html
Copyright © 2020-2023  润新知