首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

据和判定是所有“智能”程序的基础。在这章的开始,我们先看一下JavaScript是如何理解或表示数据的。这很重要,因为JavaScript包含许多数据类型(data type),而且根据数据类型来操作数据。错误地使用不同的数据类型会导致意想不到的结果。我们来看一些常见的数据类型问题,你会明白如何把一种数据类型转化成其他的。

我们也会学习条件语句(conditional statement)和循环(loop):2种最有价值的判定工具。为了在计算机语言中进行判定,我们需要让程序知道为了响应特定的情况应该发生什么,这就需要条件语句来解决。另一方面,循环允许简单地重复某一动作直到特定的条件被满足。例如,你可能需要循环表单里的每个输入并检查它包含的信息是否有效。

本章将从下面的许多方面阐述JavaScript。

l    在JavaScript中对信息进行分类和操作:数据类型和数据运算符;

l    变量;

l    数据类型转换;

l    数据对象简介:String、Date和Math对象;

l    数组:保存有顺序的数据集合,例如一个购物车中的商品;

l    使用条件语句、循环和数据评估进行判定。

注解    这一章中的例子会尽可能地保持简单,因此我们使用document.write()作为一种反馈机制,可以让你方便地看到结果。在以后的章节中,你会学到其他更流行和通用的方法。

2.1  数据、数据类型和数据运算符

数据是用来保存信息的。为了更有效地保存数据,JavaScript需要为每个数据分配一个类型(type)。这个类型规定了使用这个数据可以干什么或不能干什么。举个例子,JavaScript中有一种数据类型是数字(number),它允许对它拥有的数据进行一些计算。

在JavaScript中用来保存数据的基本类型有以下3种。

l    字符串(string):一连串的字符,如“some characters”。

l    数字(number):一个数,包括浮点数。

l    布尔值(boolean):包含一个真值(true)或假值(false)。

有时候它们也被称作基本(primitive)数据类型,因为它们只保存单个值。还有2个不同的基本数据类型。它们不保存信息,用来对特定的情况给出我们警告。

l    空值(null):表示没有数据。

l    未定义(undefined):表示没有定义也没有赋值。当你使用变量的时候,这种类型非常重要。

在这一章中我们会大量地使用这些数据类型。

2.1.1  字符串数据类型

JavaScript解释器要求字符串数据被单引号或双引号(通称为定界符,delimiter)括起来。例如,下面这个脚本会往页面中写入some characters:

引号不会被写到页面上因为它们不是字符串的一部分;它们只是简单地告诉JavaScript字符串的开始和结束的地方。使用单引号也可以轻松地做到这一点:

只要你使用与开始该字符串对应的引号结束这个字符串,2种方法都可以。不要试图如以下方式使用它们:

当然,你可能需要在字符串本身中使用单引号或者双引号,这种情况下需要使用一个不同的定界符。如果你使用双引号来标记,这个指令会按你意愿进行解释:

但如果你使用单引号来进行标记,它们将无法正确解释:

这样做会给你一个语法错误,因为JavaScript解释器以为这个字符串在Paul中的l后结束了,它不明白后面要发生什么。

注解    JavaScript语法和英语的语法类似,是使语言“可理解”的规则集合。就像英语中的语法错误会使一个句子显得没有意义一样,JavaScript中的语法错误也会使这个指令没有意义。

要避免产生JavaScript语法错误,可以使用单引号标记来分隔包含双引号的字符串或者相反:

另一方面,如果你想在字符串中既包含单引号,也包含双引号,你需要使用转义序列(escape sequence)。实际上,使用转义序列来代替我们目前使用的引号是一个好的编程习惯。因为它们使你的代码更加易懂。

转义序列

转义序列也可用于需要使用键盘不能直接输入的字符时(比如普通键盘中没有的人民币符号¥)。表2-1列出了一些最常用的转义序列。

表2-1 常用的转义序列

转义序列

字符表示的意思

\b

回退

\f

换页

\n

换行

\r

回车符

\t

制表符

\'

单引号

\"

双引号

\\

反斜杠

\xNN

NN是一个十六进制的数,表示拉丁字符集中的一个字符(拉丁字符集是说英语国家的规范)

\uDDDD

DDDD是一个十六进制的数,表示一个Unicode字符

我们来改进一下这个会引起语法错误的字符串:

使用这个转义序列(\')就可以被正确的解释了:

这个转义序列告诉JavaScript解释器,这个单引号属于字符串本身,而不是一个定界符。

ASCII是一个字符编码方法,它使用0~254的值。另外,可以使用十六进制\xNN转义序列表示的ASCII值来指定一个字符。这个字符C在十进制中是67,在十六进制中是43,因此我们可以像这样使用转义序列来往页面中写入它:

转义序列\uDDDD的工作原理大致和以上相同,但它用的是拥有65 535个字符的Unicode字符编码方法。因为在前面的几百个ASCII编码和Unicode编码是一致的,可以使用如下的方式往页面中写入字符C:

要可以获得ASCII和Unicode的详细信息,最好查找网络。对于Unicode,可以试一下http:// www.unicode.org。

2.1.2  运算符

JavaScript有许多运算符,你可以在程序中用来操作数据;你或许会从数学的角度认识它们。表2-2介绍了一些最常用的运算符。

表2-2  JavaScript运算符

运算符

功  能

+

对两个数进行加法运算或者连接两个字符串

-

从第一个数中减去第二个数

*

对两个数进行乘法运算

/

第一个数除以第二个数

%

获得除法的余数:例如98 % 10 = 8

--

数字递减1:只有在变量中有效,我们稍后会提到

++

数字递增1:只有在变量中有效,我们稍后会提到

下面是它们的应用:

输出如下:

跟数学一样,JavaScript也定义了一些运算优先级。乘法比加法的优先级要高,所以这个计算1 + 2×3会按下面的步骤执行:

所有的运算符都有一个优先级顺序。乘法、除法和求余的优先级相同,因此当它们出现在同一个等式中的时候,会按照从左到右的顺序执行。试着计算一下:

计算结果是1,因为计算的顺序是简单的从左到右:

加法和减法同样也拥有相同的优先级。

可以使用括号来提高某部分计算的优先级。例如,可以按照下面的方式,把1和1相加,然后乘以5:

计算的结果会是10,但没有括号的话结果就会是6。实际上,使用括号是个非常好的主意,即使它们不必要,因为它们可以帮助使执行的顺序变得清晰。

如果使用不止一对括号,JavaScript会简单地按照从左到右的顺序执行;如果你使用了内部括号,则按照从内到外的顺序执行:

下面是这个计算的优先执行顺序:

正如我们看到的,JavaScript的加法运算符把这些值加到一起。它如何处理这两个值取决于你使用的数据类型。例如,如果你处理的是两个存为数字数据类型的数,这个+运算符会把它们加到一起。然而,如果你处理的数据其中有一个数据类型是字符串(使用定界符来表示的),这两个值会被拼接在一起。例如:

能够对字符串使用加法运算是非常方便的[这种情况下也叫拼接运算(concatenation operate)],但如果处理的其中一个值正好与你期望的数据类型不同,它也会产生意想不到的结果。我们稍后会看一些这样的简单示例,并且分解它们。

如果处理的文本(literal)值都如我们目前所使用的那样,那么它不会有什么大问题。可是,你在程序中需要处理的很多数据都是用户输入或者脚本产生的,因此没有办法预先准确地知道将要处理的是什么值。这就要用到变量(variable)。变量是脚本中的数据占位符,它们对JavaScript来说非常重要。

2.1.3  JavaScript变量

对变量来说,JavaScript可能是最宽松的语言了。在使用它之前不必定义一个变量是什么,并且在脚本中可以随时改变一个变量的类型。然后,为了容易维护并保持一个严格的编码语法,在脚本的开头明确地声明变量或者在函数中明确定义局部变量是一个非常好的习惯。

我们通过一个唯一的名字和使用var关键字来定义一个变量。

变量名必须以字母表中的一个字符或者一个下划线开始,而名字的其他部分可以由数字、字母、美元符和下划线构成。不要用任何其他的字符。

注解    跟JavaScript中的大多数词语一样,变量名是区分大小写的:thisVariable和ThisVariable是不同的变量。给变量命名要非常小心;如果给它们命名不一致,那么你可能会碰到任何类型的错误。为了避免那样的结果,大多数程序员使用骆驼命名法(camel notation):变量名以一个小写字母开始,而后面的单词则首字母大写并且没有空格。如变量名thisVariable。

始终给你的变量起有意义的名字。在下一个例子中,我们将写一个汇率转换程序,因此我们会使用像euroToDollarRate和dollarToPound这样的变量名。对变量进行描述性命名有2个优点:当你隔一段时间回过头再来看的时候,更容易记得代码是做什么的;刚接触代码的其他人可以更容易明白程序要做什么。代码的可读性和布局对网页的开发是非常重要的。它可以更快速、更容易地发现错误并调试它们,然后按照你想要的修改代码。

注解    变量声明以关键字var开始,尽管就技术而言并不是必需的。不使用它可能有其他问题,你会在下一步中看到。

讲完了声明变量的原则,下面开始声明变量。可以声明一个变量而不对它进行初始化(给它赋一个值):

然后它就准备着等待被赋值。用于保存用户输入的变量就经常如此。

也可以同时对变量进行声明和初始化:

或者可以通过把prompt()函数的返回值或一个计算的总和赋给该变量来声明并初始化它:

prompt()函数是JavaScript的一个函数,它用来让用户输入一个值然后把它返回到代码中。这里我们把输入的值赋给变量eurosToConvert。

最好对变量初始化,尤其是在你可以给它们赋一个对程序有用的默认值的时候。哪怕初始化一个变量为空字符串也好,因为你可以对它进行核对而不会引起因为变量没有值而弹出的错误信息。

让我们看一下变量是如何提高你的代码的可读性和实用性的。下面是一个没有任何变量的代码块:

很难看出,这段代码是把欧元(euro)转化成美元(dollar),因为没有任何东西告诉我们0.872就是汇率。可是这段代码工作得很好;如果你用数字10试验一下,你就会得到如下的结果:

我们在这个例子中使用了window对象的prompt()方法来获得用户的输入(这个实例中window对象是可选的,为了保持代码简短你可以忽略它)。这个方法有2个参数:一个是显示在用户输入框上面的标签,另一个是输入框的初始值。在第4章中,你会学到更多关于prompt()及其使用的知识。假设我们需要结果显示更多的信息,如:

不使用变量,能实现的唯一方式就是让用户对他们想转换的欧元数输入两次,那样确实对用户显得不很友好。可是使用变量,我们可以临时把数据存起来,然后在我们需要的时候多次调用它:

我们使用了3个变量:一个用来存储欧元到美元的汇率,另一个存储需要转化的欧元数,最后一个保存着转换成美元的结果。然后使用两个变量把结果写出来。这个脚本不只更具实用性,而且也更加容易读懂。

2.1.4  不同数据类型的转换

大多数时候,JavaScript解释器能够识别出我们想使用的数据类型。举个例子,在下面的代码中,解释器明白数字1和2是数字类型,并会对它们做相应处理:

结果显示为:

可是,如果重写代码,使用prompt()函数允许用户输入自己的数字,我们会得到一个完全不同的结果:

如果你在提示框中输入2, 然后你就会被告知:

JavaScript解释器不是把这两个数加在一起,而是把它们进行了连接操作。这是因为prompt()函数实际上把用户输入的值返回为字符串数据类型,尽管这个字符串中包含数字字符。连接运算发生在这一行:

从效果上看,如同我们写成了:

可是,如果我们使用减法运算符:

userEnteredNumber会从1中减去。减法运算符不适用于字符串数据,所以JavaScript能计算出我们想把该数据当作数字来对待,接着把这个字符串转化成一个数,然后计算。这个同样适用于*和/运算符。typeof()运算符返回传递给它的参数的数据类型,因此我们可以使用它来看JavaScript解释器正在处理哪种数据类型:

这段代码会把字符串写到页面。要确保解释器正在使用我们想要的数字数据类型,方法就是显式地声明这个数据就是一个数。有3个函数可以用来实现这一目的。

l    Number():设法把括号里的变量值转换成一个数。

l    parseFloat():设法把括号里的值转换成一个浮点数。它从左到右地逐个字符地解析字符串,直到遇到一个字符不能用在数字里。然后它会在那个点停止并把这个字符串转换成数字。如果第一个字符就不能在数字里使用,返回的结果是NaN(它代表非数字,Not a Number)。

l    parseInt():把括号里的值转换成一个整数,它不用四舍五入,而是把小数部分直接去掉。 任何传递到这个函数中的非数字参数都会被丢弃掉。如果第一个字符不是 +、- 或一个阿拉伯数字,返回的结果是NaN。

让我们来看一下这些函数在实际上是如何工作的:

如果输入23.50,你会得到这样的输出:

在第一行中输入的数据读成一个字符串。接着parseFloat()函数把23.50从一个字符串转换成一个浮点数,在下一行中parseInt()函数把小数部分给直接去掉(不四舍五入)。然后使用Number()函数把这个变量转换成一个数字,并使用变量userEnteredNumber来保存结果(覆盖它所保存的字符串),在最后的一行可以看到userEnteredNumber的数据类型确实是个数字。

如果在用户提示框中输入23.50abc,你会得到这样的输出:

两个结果是非常相似的,但是这次Number()函数返回了NaN。parseFloat()和parseInt()函数仍然返回一个数字,因为它们是从左到右尽可能多地把字符串转换成数字,当遇到一个非数字时才停止。Number()函数会拒绝任何包含非数字字符的字符串(阿拉伯数字、一个有效的小数位、+和-符号是允许的,其他的字符则不行)。

如果输入abc,你就会得到:

没有任何一个函数可以发现一个有效的数字,因此它们都返回NaN,可以把它看作一个数字数据类型,但不是一个有效的数字。这是一个检查用户输入有效性的很好方法,稍后我们就会使用它来进行验证。

回到开始时提出的问题:使用prompt()来重新得到一个数字。所有我们要做的就是使用讨论prompt()函数时用到的其中一个函数,告诉解释器用户输入的数据应该转化成数字数据类型:

这样不会抛出任何错误,但是它对用户也没有多大帮助,因为NaN的含义并不是一个常识。稍后我们会处理条件语句,你会了解如何阻止对于不了解JavaScript的用户没有意义的输出。

到目前为止,我们已讲解了所有你需要了解的基本数据类型和变量。你已经明白,基本数据类型可以简单地保存一个值。可是,JavaScript也可以处理复杂的数据,它使用复合(composite)数据类型来实现这个功能。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论