JavaScript 数据类型

计算机程序的运行需要对 值(value) 进行操作。在编程语言中,能够表示并操作的值的类型称做 数据类型(type)。

编程语言最基本的特性就是能够支持多种数据类型。当程序需要将值保存起来以备将来使用时,便将其赋值给(将值“保存”到)一个变量(variable)。

变量是一个值的符号名称,可以通过 名称 来获得对值的引用。变量的工作机制是编程语言的另一个基本特性。

JavaScript 的数据类型分为两类:

  • 原始类型(primitive type):

    包括:数字、字符串和布尔值。

    JavaScript 有两个特殊的原始值:null(空)、undefined(未定义)。它们不是数字、字符串和布尔值。它们通常分别代表了各自特殊类型的唯一的成员。

  • 对象类型(object type)

    对象(object)是属性(property)的集合。每个属性都由 名:值对 构成。

    其中有一个比较特殊的对象,全局对象(global object)。

    普通的 JavaScript 对象是 命名值 的无序集合。JavaScript 定义了一种特殊对象——数组(array),表示带编号(索引/index)的值的有序集合。

    JavaScript 还定义了另一种特殊对象——函数。函数是具有与它(函数名)相关联的可执行代码的对象。通过调用函数来运行可执行代码,并返回运算结果。对于 JavaScript 函数来说,它们都是真值,并且 JavaScript 可以将函数当做普通对象来处理。

    JavaScript 解释器有自己的内存管理机制,可以自动对内存进行垃圾回收(garbage collection)。这意味着程序可以按需创建对象,程序员不必担心这些对象的销毁和内存回收。当不再有任何引用指向一个对象时,解释器就会知道这个对象没用了,然后自动回收它所占用的内存资源。

    JavaScript 是一种面向对象的语言。不严格地讲,这意味着不用全局的定义函数去操作不同类型的值,数据类型本身可以定义方法(method)来操作值。例如,要对数组 a 中的元素进行排序,不必将 a 传入 srot() 函数,而是调用 a 的一个方法 a.sort()。

    从理论上讲,只有 JavaScript 对象才能拥有方法;从技术上讲,数字、字符串和布尔值也可以拥有自己的方法。在 JavaScript 中,只有 null 和 undefined 是无法拥有方法的值。

JavaScript 的类型可以分为 原始类型 和 对象类型,也可分为 可以拥有方法的类型 和 不能拥有方法的类型,同样也可分为 可变(mutable)类型和不可变(immutable)类型。

  • 可变类型的值是可修改的。对象和数组属于可变类型:

    JavaScript 程序可以更改对象属性值和数组元素值。

  • 数字、布尔值、null 和 undefined 属于不可变类型:

    例如,修改一个数值的内容本身就无法实现。

    字符串虽然可以看成是由字符组成的数组,但是在 JavaScript 中是不可变的。可以访问字符串任意位置的字符,但 JavaScript 并未提供修改已知字符串的字符内容的方法。

每种计算机语言都有自己所支持的数据类型。在 JavaScript 脚本语言中采用的是 弱类型 的方式,数据(变量或常量)

  • 不必先声明该数据类型,使用或赋值时再确定其数据类型。
  • 可以先声明该数据类型,即通过在赋值时自动说明其数据类型。

数字类型

数字(Number)是最基本的数据类型。在 JavaScript 中,和其他程序设计语言(如 C 和 Java)的不同之处在于,它并不区别整型数值和浮点型数值。在 JavaScript 中,所有的数字都是由浮点型表示的。

JavaScript 采用 IEEE754 标准定义的 64 位浮点格式表示数字。

数值直接量

当一个数字直接出现在 JavaScript 程序中时,称之为数值直接量(Numeric Literal)。

在任何数值直接量前加负号 - 可以构成它的负数。但是负号是一元求反运算符,它不是数值直接量语法的一部分。

整型数据

在 JavaScript 程序中,十进制的整数是一个数字序列。

						
0
7
-8
100
						
					

十六进制和八进制

十六进制数据是以 "0X" 和 "0x" 开头,其后跟随十六进制数字序列的直接量。

十六进制数字:0~9, a(A)~f(F)。

						
0xff        //15*16 + 15 = 255(十)
						
					

尽管 ECMAScript 标准不支持八进制数据,但是 JavaScript 的某些实现却允许采用八进制格式的整型数据。

八进制数据是以 "0" 开头,其后跟随八进制数字序列的直接量。

八进制数字:0~7。

						
0377        //3*64 + 7*8 + 7 = 255(十)
						
					

说明:

  • 由于某些 JavaScript 实现支持八进制数据,有些不支持,所以最好不要使用以 0 开头的整型数据。

浮点型数据

浮点型数据可以具有小数点,采用的是传统的科学计数法的语法。

一个实数值可以被表示为整数部分后加小数点和小数部分。

还可以使用 指数法 表示浮点型数据。实数后跟随字母 e 或 E,后面加上正负号,其后再加一个整型指数。这种记数法表示的数值等于前面的实数乘以 10 的指数次幂。

						
3.12e2          //312
312e-2          //3.12
						
					

字符串类型

字符串(string)是由 Unicode 字符、数字、标点符号等组成的序列。

JavaScript 程序中的字符串类型数据是包含在 单引号'' 或 双引号"" 中的。由单引号定界的字符串中可以包含双引号,由双引号定界的字符串中可以包含单引号。

						
'hello world!'
"Hi!"
'name="myname"'
"name='myname'"
"You can call me 'Tom'!"
						
					
						
<script type="text/javascript">
  var str1 = "My name is 'wanghao'!";         //=> My name is 'wanghao'!
  var str2 = 'My name is "wanghao"!';         //=> My name is "wanghao"!
  var str3 = 'My name is \'wanghao\'!';       //=> My name is 'wanghao'!
  var str4 = "My name is \"wanghao\"!";       //=> My name is "wanghao"!
</script>
						
					

说明:

  • 单引号包含双引号或双引号包含单引号时,不需要进行转义操作。
  • 双引号包含双引号或单引号包含单引号时,需要进行转义操作。

布尔类型

布尔类型数据的值只有两个可选,布尔类型直接量 true 和 false。

布尔类型数据通常用于 JavaScript 的控制结构。

可以把布尔类型数据看作是:on/1/true 和 off/0/false。

特殊数据类型

转义字符

以 反斜杠\ 开头的不可显示的特殊字符通常称为 控制字符 或者 转义字符。

通过转义字符可以在字符串中添加不可显示的特殊字符,或者防止引号匹配混乱的问题。

JavaScript 常用转义字符
转义字符说明
\b退格
\n回车换行
\tTab 符号
\f换页
\'单引号
\"双引号
\v跳格(Tab, 水平)
\r换行
\\反斜杠
\OOO八进制整数,范围为 000~777
\xHH十六进制整数,范围为 00~FF
\uhhhh十六进制编码的 Unicode 字符

说明:

  • 在 document.writeln(); 语句中使用转义字符时,只有将其放在格式化文本块中才会起作用。
						
document.writeln("Hello\nWorld!");     //=> HelloWorld!(转义字符不起作用)

document.writeln("<pre>");
document.writeln("Hello\nWorld!");
document.writeln("</pre>");
						
					

未定义值

未定义类型的变量是 undefined,表示变量还没有被赋值,或者赋值一个不存在的属性值。

						
var a;                          //=> a is undefined
var a = String.notProperty;     //=> a is undefined
						
					

JavaScript 中有一种特殊类型的数字常量 NaN,即“非数字”。当在程序中由于某种原因发生计算错误后,将产生一个没有意义的数字,此时 JavaScript 返回的数字值就是 NaN。

空值

JavaScript 中的关键字 null 是一个特殊值,表示为空值,用于定义空的或者不存在的引用。

如果试图引用一个没有定义的变量,则返回一个 null 值。

null 不等同于 空的字符串"" 或者 0。

null 与 undefined 的区别是:null 表示一个变量被赋值一个空值;undefined 表示该变量尚未被赋值。