犀牛书第3章 数据类型和值(下篇):传值与传址

来源:互联网 发布:网络刷手是可靠吗 编辑:程序博客网 时间:2024/05/22 00:07

在JavaScript中和在所有其他编程语言中一样,可以用三种方式来操作一个数据值:

可以复制它。例如可以把它赋给一个新的变量。

可以把它作为参数传递给一个函数或方法。

可以把它和另外一个值进行比较,看两个值是否相等。

要理解任何的编程语言,都必须理解这三种操作在这种语言里是如何实现的。

有两种截然不同的方式可以操作数据的值,这两种技术分别叫做传值与传址。

传值:当一个数据是通过值被操作的,那么,所关系到的是数据的值。在赋值过程中,对实际的值制作了一份拷贝,这份拷贝存储到一个变量、对象属性或数组元素中。拷贝的值和原始的值是分别存储的两份完全独立的值。当一份数据通过值传递给一个函数,数据的一份拷贝被传递给这个函数;如果函数修改了这个值,修改只是影响到函数所拥有的该数据的拷贝,并不会影响到原始的数据。最好,当一个数据通过值和另一个数据作比较,两份截然不同的数据片段必须确实代表相同的值(这通常意味着进行逐个字节的比较后发现它们是相等的)。

传址:使用这种方法,数值只有一份真实的拷贝,被操作的是对该值的引用(地址)。如果以传址的方式操作一个值,变量并不会直接存储该值,它们只是存储该值的地址,被复制、传递和比较的都是这个地址。因此在传址的赋值操作中,只是这个值的地址被赋值,而不是这个值的一份拷贝,也不是这个值本身。在赋值之后,新的变量所指向的值和原始变量所指向的值相同。两个地址都是有效的,都可以用来操作这个值;如果值通过一个地址发生了变化,这个改变也会通过原始地址表现出来。当一个值通过传址方式传递给函数的时候,情况也是相似的。

这是操作值的两种截然不同的方式,它们有着非常重要的含义,应该弄懂它们。

1. 基础类型和引用类型

JavaScript的基本规则是:基本数据类型通过传值来操作,而引用类型通过传址来操作。

2. 复制和传递字符串

JavaScript字符串并不能很好地适合基本类型和引用类型的二分法。那么JavaScript的字符串是如何传递和复制字符串的呢?如果我们编写一些JavaScript代码来测试一下字符串的操作,就会遇到一个重要的障碍:没有办法去修改一个字符串的内容。因为JavaScript字符串是不可变的,这就是说,没有任何办法改变字符串中的字符。既然字符串是不可变的,那么最初的问题就变得没有意义了,因为没有办法分辨字符串是通过传值还是传址来传递的。

3. 比较字符串

不管事实如何,从效率来推测,我们推测JavaScript字符串是通过传址来复制和传递的,而它们是通过传值来比较的。


原创粉丝点击