犀牛书第3章 数据类型和值(下篇):传值与传址
来源:互联网 发布:网络刷手是可靠吗 编辑:程序博客网 时间:2024/05/22 00:07
在JavaScript中和在所有其他编程语言中一样,可以用三种方式来操作一个数据值:
①可以复制它。例如可以把它赋给一个新的变量。
②可以把它作为参数传递给一个函数或方法。
③可以把它和另外一个值进行比较,看两个值是否相等。
要理解任何的编程语言,都必须理解这三种操作在这种语言里是如何实现的。
有两种截然不同的方式可以操作数据的值,这两种技术分别叫做传值与传址。
传值:当一个数据是通过值被操作的,那么,所关系到的是数据的值。在赋值过程中,对实际的值制作了一份拷贝,这份拷贝存储到一个变量、对象属性或数组元素中。拷贝的值和原始的值是分别存储的两份完全独立的值。当一份数据通过值传递给一个函数,数据的一份拷贝被传递给这个函数;如果函数修改了这个值,修改只是影响到函数所拥有的该数据的拷贝,并不会影响到原始的数据。最好,当一个数据通过值和另一个数据作比较,两份截然不同的数据片段必须确实代表相同的值(这通常意味着进行逐个字节的比较后发现它们是相等的)。
传址:使用这种方法,数值只有一份真实的拷贝,被操作的是对该值的引用(地址)。如果以传址的方式操作一个值,变量并不会直接存储该值,它们只是存储该值的地址,被复制、传递和比较的都是这个地址。因此在传址的赋值操作中,只是这个值的地址被赋值,而不是这个值的一份拷贝,也不是这个值本身。在赋值之后,新的变量所指向的值和原始变量所指向的值相同。两个地址都是有效的,都可以用来操作这个值;如果值通过一个地址发生了变化,这个改变也会通过原始地址表现出来。当一个值通过传址方式传递给函数的时候,情况也是相似的。
这是操作值的两种截然不同的方式,它们有着非常重要的含义,应该弄懂它们。
1. 基础类型和引用类型:
JavaScript的基本规则是:基本数据类型通过传值来操作,而引用类型通过传址来操作。
2. 复制和传递字符串:
JavaScript字符串并不能很好地适合基本类型和引用类型的二分法。那么JavaScript的字符串是如何传递和复制字符串的呢?如果我们编写一些JavaScript代码来测试一下字符串的操作,就会遇到一个重要的障碍:没有办法去修改一个字符串的内容。因为JavaScript字符串是不可变的,这就是说,没有任何办法改变字符串中的字符。既然字符串是不可变的,那么最初的问题就变得没有意义了,因为没有办法分辨字符串是通过传值还是传址来传递的。
3. 比较字符串:
不管事实如何,从效率来推测,我们推测JavaScript字符串是通过传址来复制和传递的,而它们是通过传值来比较的。
- 犀牛书第3章 数据类型和值(下篇):传值与传址
- 犀牛书第3章 JavaScript数据类型和值(上篇)
- 犀牛书第3章 数据类型和值(中篇)
- 犀牛书第4章 变量(下篇):深入理解JavaScript中的变量作用域
- 犀牛——第3章 类型、值和变量 3.1 数字
- 犀牛——第3章 类型、值和变量 3.2 文本
- 犀牛——第3章 类型、值和变量 3.5 全局对象
- 犀牛——第3章 类型、值和变量 3.6 包装对象
- 犀牛——第3章 类型、值和变量 3.8 类型转换
- 犀牛——第3章类型、值和变量3.9变量声明
- 犀牛——第3章类型、值和变量3.10变量作用域
- 犀牛——第3章 类型、值和变量 3.3布尔值 3.4 null和undefined
- 犀牛书第1章 JavaScript概述
- 犀牛书第4章 变量(上篇)
- 犀牛书第4章 变量(中篇)
- 犀牛——第3章 类型、值和变量 3.7不可变的原始值和可变的对象引用
- 犀牛——第4章表达式和运算符
- 犀牛——第13章 13.4 兼容性和互用性
- linux io分析
- 简易画图板的升级版本1.2
- 他人的近期目标
- ArrayList对动态数组进行排序数组由Scanner后台动态接收数组元素
- 选择排序实例
- 犀牛书第3章 数据类型和值(下篇):传值与传址
- Android Thread.UncaughtExceptionHandler捕获 .
- 冒泡排序实例
- 字符串进行截取替换操作实例代码
- Linux/Unix环境下的make和makefile详解
- ALSA架构简介和ALSA学习
- 算法小计
- dom4j操作xml
- Java实现拷贝文件详细代码