2.1 数据类型
在JavaScript脚本语言中,采用的是弱类型的方式,即一个数据(变量或常量)不必先作声明,可在使用或赋值时再确定其数据的类型。当然,也可以先声明该数据的类型,即赋值时说明其数据类型。本节将详细介绍JavaScript脚本中的几种数据类型。
2.1.1 数值型
数值(Number)是最基本的数据类型。JavaScript和其他程序设计语言(如C和Java)的不同之处在于,它并不区别整型数值和浮点型数值,所有的数字都是由浮点型表示的。JavaScript采用IEEE754标准定义的64位浮点格式表示数字,这意味着它能表示的最大值是±1.7976931348623157×10308,最小值是±5×10-324。
当一个数字直接出现在JavaScript程序中时,称之为数值直接量(Numeric Literal)。JavaScript支持数值直接量的形式有以下3种,下面对其进行详细介绍。
注意
在任何数值直接量前加负号(-),可以构成它的负数。负号是一元求反运算符,不是数值直接量语法的一部分。
1.整型数据
在JavaScript程序中,十进制的整数是一个数字序列,例如:
0 7 -8 1000
JavaScript的数字格式允许精确地表示-900719925474092(-253)和900719925474092(253)之间的所有整数,包括-900719925474092(-253)和900719925474092(253)。使用超过这个范围的整数,就会失去尾数的精确性。需要注意的是,JavaScript中的某些整数运算是对32位的整数执行的,它们的范围为-2147483648(-231)~2147483647(231-1)。
2.十六进制和八进制
JavaScript不但能够处理十进制的整型数据,还能识别十六进制(以16为基数)的数据。所谓十六进制数据,是以0X和0x开头,其后跟随十六进制数字串的直接量。十六进制的数字可以是0~9中的某个数字,也可以是a(A)~f(F)中的某个字母,用来表示0~15(包括0和15)的某个值。下面是十六进制整型数据的例子。
0xff //15*16+15=255(基数为10) 0xCAFE911
尽管ECMAScript标准不支持八进制数据,但JavaScript的某些实现却允许采用八进制(基数为8)格式的整型数据。八进制数据以数字0开头,其后跟随一个数字序列,这个序列中的每个数字都在0~7(包括0和7)。例如:
0377 //3*64+7*8+7=255(基数为10)
由于某些JavaScript实现支持八进制数据,有些不支持,因此最好不要使用以0开头的整型数据,因为不知道具体的JavaScript实现是将其解释为十进制,还是解释为八进制。
3.浮点型数据
浮点型数据可以具有小数点,采用的是传统科学记数法的语法。一个实数值可以被表示为整数部分后加小数点和小数部分。
此外,还可以使用指数法表示浮点型数据,即实数后跟随字母e或E,后面加上正负号,其后再加上一个整型指数。这种记数法表示的数值等于前面的实数乘以10的指数次幂,语法格式如下:
[digits] [.digits] [(E|e[(+|-)])]
例如:
1.2 .33333333 3.12e11 //3.12×1011 1.234E﹣12 //1.234×10-12
注意
虽然实数有无穷多个,但是JavaScript的浮点格式能够精确表示出来的却是有限的(确切地说是18437736874454810627个),这意味着在JavaScript中使用实数时,数字通常是真实数字的近似值。不过即使是近似值,也足够用了。
2.1.2 字符串型
字符串(String)是由Unicode字符、数字、标点符号等组成的序列,它是JavaScript用来表示文本的数据类型。程序中的字符串型数据是包含在单引号或双引号中的,由单引号定界的字符串中可以含有双引号,由双引号定界的字符串中也可以含有单引号。
(1)单引号括起来的一个或多个字符,代码如下:
'啊' '活着的人却拥有着一颗沉睡的心'
(2)双引号括起来的一个或多个字符,代码如下:
"呀" "我想学习JavaScript"
(3)单引号定界的字符串中可以含有双引号,代码如下:
'name="myname"'
(4)双引号定界的字符串中可以含有单引号,代码如下:
"You can call me 'Tom'!"
【例2.1】 下面分别定义4个字符串。(实例位置:资源包\TM\sl\2\01)
代码如下:
执行上面的代码,运行结果如图2.1所示。
图2.1 运行结果
由上面的实例可以看出,单引号内出现双引号或双引号内出现单引号时,不需要进行转义。但是,双引号内出现双引号或单引号内出现单引号,则必须进行转义(转义字符将在2.1.4节中详细讲解)。
2.1.3 布尔型
数值和字符串两种数据类型的值都无穷多个,但是布尔数据类型的值只有两个,分别由直接量true和false表示,用来说明某个事物是真还是假。
布尔值通常在JavaScript程序中用来比较所得的结果,例如:
n==1
这行代码测试了变量n的值是否和数值1相等。如果相等,比较的结果就是布尔值true,否则结果就是false。
布尔值通常用于JavaScript的控制结构。例如,JavaScript的if…else语句就是在布尔值为true时执行一个动作,在布尔值为false时执行另一个动作。通常将创建布尔值与使用布尔值进行比较的语句结合在一起。例如:
本段代码检测了n是否等于1。如果相等,就给m增加1,否则给n增加1。
有时候可以把两个布尔值看作是on(true)和off(false)或者yes(true)和no(false),这比true和false更为直观。有时候把它们看作是1(true)和0(false)会更加有用。实际上,JavaScript确实是这样做的,在必要时会将true转换成1,将false转换成0。
2.1.4 特殊数据类型
1.转义字符
以反斜杠开头的不可显示的特殊字符通常称为控制字符,也被称为转义字符。通过转义字符可以在字符串中添加不可显示的特殊字符,或者防止引号匹配混乱的问题。JavaScript常用的转义字符如表2.1所示。
表2.1 JavaScript常用的转义字符
在“document.writeln();”语句中使用转义字符时,只有将其放在格式化文本块中才会起作用,所以脚本必须在<pre>和</pre>标记内。
例如,下面应用转义字符使字符串换行,程序代码如下:
document.writeln("<pre>"); document.writeln("轻松学习\nJavaScript语言!"); document.writeln("</pre>");
运行结果为:
轻松学习 JavaScript语言!
如果上述代码不使用<pre>和</pre>标记,则转义字符不起作用。
document.writeln("快快乐乐\n平平安安!");
上述代码的运行结果为:
快快乐乐平平安安!
2.未定义值
未定义类型的变量是undefined,表示变量还没有赋值(如“var a;”),或者被赋予了一个不存在的属性值(如“var a=String.notProperty;”)。
此外,JavaScript中有一种特殊类型的数字常量NaN,即“非数字”。当在程序中由于某种原因发生计算错误后,将产生一个没有意义的数字,此时JavaScript返回的数字值就是NaN。
3.空值(null)
JavaScript中的关键字null是一个特殊的值,表示为空值,用于定义空的或不存在的引用。如果试图引用一个没有定义的变量,则返回一个null值。需要注意的是,null不等同于空的字符串(" ")或0。
由此可见,null与undefined的区别是:null表示一个变量被赋予了一个空值,而undefined则表示该变量尚未被赋值。