传值和传址

来源:互联网 发布:js中鼠标点击事件 编辑:程序博客网 时间:2024/05/22 06:46

对操作数据的传值和传址讨论是具有一般意义的,而二者的区别适用于所有的编程语言。

 

一:传值                                                                                         

1.复制:实际复制的是值,存在两个不同的,独立的拷贝  。

2.传递:传递给函数的是值的一个独立的拷贝,对它的改变在函数外部没有影响。

3.比较:比较的是两个独立的值(通常逐字节比较),以判断他们是否相等。

 

二:传址

1.复制:复制的只是对数值的引用。如果通过这个新的引用修改了数值,这个改变对最初的引用来说也可见。

2.传递:传递给函数的是对数值的一个引用。如果函数通过传递给它的应用修改了数值,这个改变在函数外部也可见。

3.比较:比较的是两个引用,以判断它们引用的是否是同一个数值。对两个不同的数值的引用不相等,即使这两个数值是由相同的子节构成的。

 

JavaScript的基本规则是:基本数据类型通过传值来操作,而引用类型,从其名字可以看出,通过传址来操作。数字和布尔类型在JavaScript中都是基本类型。因为他们只是有一些很小的、固定数目的字节组成,这些字节很容易在JavaScript解释器的较低层操作。另一方面,对象是引用类型,数组和函数,是对象的特殊类型,也是引用类型。这些数据类型可以包含任意数目的属性和元素,因此他们无法向固定大小的基本类型值那样很容易的操作。既然对象和数值的值可能会变得很大,那么通过传址来操作这些类型也就没有什么意义,因为这样可能会牵涉到对大量内存低效率的复制和比较。

在C++和Java中,字符串是引用类型,是通过传址来比较的。JavaScript是一种高级语言,并且认为比较字符串的时候,通过传值来比较它们。

总结:

类型      复制     传递     比较

数字      传值     传值     传值

布尔      传值     传值     传值

字符串   不可变  不可变  传值

对象      传值     传值     传值

 

原创粉丝点击