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

 

字符串类型

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

类型
复制
传递
比较
数字 传值 传值 传值
布尔 传值 传值 传值
字符串 不可变 不可变 传值
对象 传址 传址 传址
posted @ 2014-06-28 22:59 我是一个菜菜菜 阅读(...) 评论(...) 编辑 收藏