2.3.2 字符串
要显示一个名字、一个句子或者任何一串字符,都要使用字符串。字符串只是包含在引号中的一系列字母和其他的符号。例如,“Welcome Hal”和“You are here”都是字符串。第1章把字符串和alert命令一起使用:alert('Hello World!');。
字符串的开始引号告诉JavaScript解释器,接下来的是一个字符串,即一系列的符号。解释器按照字面意义接受符号,而不是试图将它们解释为对JavaScript来说特殊的任何内容(例如命令)。当解释器遇到了最后的引号,它知道已经到达了字符串的末尾,并且继续程序的下一部分。
我们可以使用双引号("hello world")或者单引号('hello world')把字符串括起来,但是,必须确保在字符串的开始和末尾使用同一种引号(例如,"this is not right'不是一个有效的字符串,因为它以双引号开始,却以单引号结束)。
注意:你会注意到,在本书大部分内容中,我们使用弯引号(""和’'),但是当编写JavaScript代码时,你只需用规范的直引号(""和’')。代码示例(例如aler t('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."’。即便不需要转义双引号(因为单引号包围了整个字符串),一些程序员还是这么做了,以便清楚地表示双引号只是一个引号。