首页 > 代码库 > JS 基础知识2 传值和传址

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 + "\n" + "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] + "\n" + "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";     //这里定义了两个对象,虽然值一样,但是不是同样的地址,所以为false14         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

 

字符串类型

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

类型
复制
传递
比较
数字传值传值传值
布尔传值传值传值
字符串不可变不可变传值
对象传址传址传址