2.3 数据类型
我们每天处理不同类型的信息。我们的姓名、食品的价格、医生的办公地址,以及下一个生日的日期,这些对我们来说都是很重要的信息。我们根据所拥有的这些信息来决定做些什么以及如何过日子。计算机程序也一样。它们也依赖信息来做事情。例如,要计算购物车的总金额,就需要知道订购的每一项的价格和数量;而要定制带有访问者姓名的一个页面(“Welcome Back, Kotter”),则需要知道他的名字。
编程语言通常把信息划分为不同的类型,并且以不同的方式来处理每种类型。在JavaScript中,最基本的数据类型是数值、字符串和Boolean(布尔值)。
2.3.1 数值
数值用来计数和计算,可以记录距离暑假还有多少天,或者计算购买两张电影票的总价。数值在JavaScript编程中非常重要:可以使用数值来统计一个访问者访问了Web页面多少次,指定Web页面上的一个项目的具体像素位置,或者确定一个访问者想要订购多少产品。
在JavaScript中,用一个数字字符来表示一个数值,例如5,就是数值5。也可以使用带有小数点的小数,例如5.25和10.3333333。JavaScript甚至允许使用负数,例如—130。
既然数值通常用于计算,那么程序就经常会包含数学运算。我们将在后面的内容中学习操作符,这里只是给出使用JavaScript数值的一个例子。假设要在Web页面上显示值5和15相加的和,可以使用如下的一行代码:
document.write(5 + 15);
这行JavaScript代码把两个数相加,并且在Web页面上显示其和(20)。有很多不同的方法来操作数值,我们将从14.3.1节开始学习它们。
2.3.2 字符串
要显示一个名字、一个句子或者任何一串字符,都要使用字符串。字符串只是包含在引号中的一系列字母和其他的符号。例如,“Welcome Hal”和“You are here”都是字符串。第1章把字符串和alert命令一起使用:alert('Hello World!');。
字符串的开始引号告诉JavaScript解释器,接下来的是一个字符串,即一系列的符号。解释器按照字面意义接受符号,而不是试图将它们解释为对JavaScript来说特殊的任何内容(例如命令)。当解释器遇到了最后的引号,它知道已经到达了字符串的末尾,并且继续程序的下一部分。
我们可以使用双引号("hello world")或者单引号('hello world')把字符串括起来,但是,必须确保在字符串的开始和末尾使用同一种引号(例如,"this is not right'不是一个有效的字符串,因为它以双引号开始,却以单引号结束)。
注意: 你会注意到,在本书大部分内容中,我们使用弯引号(""和''),但是当编写JavaScript代码时,你只需用规范的直引号(""和'')。代码示例(例如alert(‘Warning, warning!’); below)使用了不适当的引号类型。要怪就怪Gutenberg——他不知道如何编程。
因此,要弹出一个带有消息“Warning, warning!”的警告框,应该这样写:
alert('Warning, warning!');
或者这样写:
alert("Warning, warning!");
我们经常在程序中使用字符串:当添加警告消息的时候,在处理Web表单上的用户输入的时候,以及操作Web页面的内容的时候。字符串是如此重要,以至于我们从14.1.1节开始专门学习如何使用它们。
常见问题
把引号放入字符串
当我们试图创建其中包含引号的一个字符串的时候,程序无法工作。为什么会这样?
在JavaScript中,引号表示一个字符串的开始和结束,即便你不希望它们这么做。当JavaScript解释器遇到第一个引号时,它就对自己说:“哈,这是一个字符串。”当它遇到一个匹配的引号,它就认为已经到达了字符串的末尾。这就是为什么不能创建一个像"He said, "Hello.""这样的字符串。在这个例子中,第一个引号(在单词"He"的前面)表示字符串的开始,但是,一旦JavaScript解释器遇到第二个引号(在单词"Hello"的前面),它就认为这个字符串结束了,因此,最终得到字符串"He said, ",而Hello.部分则导致一个JavaScript错误。
有几种方式可以避免这个难题。最容易的方法就是使用单引号来包围其中带有一个或多个双引号的字符串。例如,'He said, "Hello."'是一个有效的字符串,单引号创建了字符串,其中的双引号则是字符串的一部分。同样,我们可以使用双引号来包围其中带有一个单引号的字符串,例如"This isn't fair"。
另一种方法是,告诉JavaScript解释器:按照字面意义处理字符串中的引号,即把引号当做该字符串的一部分,而不是字符串的结束。我们使用转义字符来做到这点。如果在引号的前面使用一个反斜杠(\),引号就会当做字符串的一部分来处理。我们可以像这样重写上面的例子:"He said, "Hello.\ ""。在一些情况下,转义字符是唯一的选择。例如,'He said, "This isn\'t fair."'。由于字符串包围在单引号中,单词"isn't"中独立的单引号的前面必须使用一个反斜杠,即isn\'t。
在并非必需的情况下也可以转义引号,作为澄清引号应该按照字面意义处理的一种方式。例如,'He said, "Hello."'。即便不需要转义双引号(因为单引号包围了整个字符串),一些程序员还是这么做了,以便清楚地表示双引号只是一个引号。
2.3.3 布尔值
数值和字符串提供了无限的可能性,而Boolean(布尔值)数据类型则比较简单,只是true或false两个值之一。当创建一个JavaScript程序来智能地响应用户的输入和操作的时候,会遇到Boolean数据类型。例如,如果想要在提交一个表单之前确保访问者提供了一个E-mail地址,可以通过问一个简单的问题来向页面添加逻辑:“Did the user type in a valid email address?”。这个问题的答案是一个Boolean值:要么E-mail地址是有效的(true),要么是无效的(false)。根据这个问题的答案,页面以不同的方式来响应。例如,如果E-mail地址是有效的(true),那么提交表单;如果地址是无效的(false),那么显示一条错误消息并阻止表单提交。
实际上,Boolean值如此重要,以至于JavaScript包含了两个专门的关键字来表示这些值,它们是true和false。
我们将在3.1.2节学习在给程序添加逻辑的时候Boolean值是如何发挥作用的。