首页 > 代码库 > 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
字符串类型
前面看了这么多类型,一直都没有介绍字符串类型,它不好直接分为基础类型和引用类型,因为字符串是一种任意的长度,看上去应该是引用类型,可是他却不是对象,所以也不可作为引用类型。
类型 | 复制 | 传递 | 比较 |
数字 | 传值 | 传值 | 传值 |
布尔 | 传值 | 传值 | 传值 |
字符串 | 不可变 | 不可变 | 传值 |
对象 | 传址 | 传址 | 传址 |