3.1.4 更复杂的条件
当处理多个不同的变量时,经常需要更加复杂的条件语句。例如,当验证表单中一个必需的E-mail地址字段的时候,我们想要确保字段不为空并且字段包含一个E-mail地址(而不只是随机输入的字母)。幸运的是,JavaScript允许做这类检查。
多个条件为真时
我们通常需要根据多个因素的组合来做出决定。例如,如果有足够的钱,可能想去看电影,并且也有想看的电影正在放映。在这种情况下,只有两个条件都为true时,才会去看电影。在JavaScript中,可以使用逻辑AND操作符来组合条件,可以用两个&符号(&&)表示。通过AND操作符可以把两个条件组合为一个条件语句。例如,如果想要查看一个数值是否在1~10之间,可以这么做:
if(a<10&&a>1){
//the value in a is between 1 and 10
alert("The value"+a+"is between 1 and 10");
}
这个例子中有两个条件:第一个条件a<10询问存储在变量a中的值是否小于10;第二个条件a>1等同于“这个值是否大于1”。只有在两个条件都为true的时候,包含在花括号之间的JavaScript代码才会运行。因此,如果变量a中存储了数值0,第一个条件(a<10)为true(0小于10),但是,第二个条件为false(0不大于1)。
不仅限于使用两个条件。只要需要,可以使用&&操作符连接尽可能多的条件:
if(b>0&&a>0&&c>0){
//all three variables are greater than 0
}
这段代码检查3个变量以确保这3个变量的值都大于0。如果有一个变量拥有值0或者更小的值,那么将不会执行花括号中的代码。
至少一个条件为true时
还有些时候,我们也要检查一系列的条件,但是只需要一个为true。例如,假设添加了一个键盘控制,以便访问者可以在一个照片库中从一幅图片跳转到另一幅图片。当访问者按下N键的时候,显示下一张照片。在这种情况下,当他按下n(小写)的时候,或者已经按下Caps Lock键的时候,即N(大写),都希望跳转到下一幅照片。我们需要一种或者/或者的逻辑:或者这个键按下,或者那个键按下。逻辑OR操作符有了用武之地,它用两个管道符号(||)表示:
if(key=='n'||key=='N'){
//move to the next photo
}
提示:按下Shift-\可以输入一个管道符号。斜杠和管道符号共用的输入键通常在回车键的上方。
使用OR操作符,只要一个条件为真,就会运行花括号之间的JavaScript代码。
和AND操作符一样,我们可以比较两个以上的条件。例如,假设我们要创建一个JavaScript赛车游戏。玩家有时间的限定、有限的汽油量和有限的车辆数目(每次他撞毁或失去一辆车)。为了让游戏更有挑战性,当这三项都用完的时候,我们让游戏结束:
if(gas<=0||time<=0||cars<=0){
//game is over
}
在测试多个条件的时候,有时候很难搞清楚条件语句的逻辑。一些程序员把每个条件组合到一对圆括号中,以使得逻辑更容易理解:
if((key=='n')||(key=='N')){
//move to the next photo
}
要阅读这段代码,只需要把每个组当成一个单独的测试。圆括号之间的操作的结果要么总是true,要么总是false。
对条件取反
如果你是超人迷,可能会知道Bizarro,这是超人的对头,居住在一个名叫Htrae(Earth的逆向拼写)的立方体卫星,其制服有一个反写的S,并且其通常的行为方式都是和超人相反的。当Bizarro说“是”的时候,他实际的意思是“不是”;而当他说“不是”的时候,他实际的意思是“是”。
JavaScript编程有一个类似的字符,叫做NOT操作符,它由一个惊叹号(!)表示。我们已经看到了NOT操作符和等号符号一起使用,表示“不等于”(!=)。但是,NOT操作符可以单独使用来表示把一个条件语句的结果取反;换句话说,它可以使得false意味着true,而使得true成为false。
当我们想要根据一个否定条件来运行某些代码的时候,就使用NOT操作符。例如,假设我们已经创建了一个名为valid的变量,其中包含了一个Boolean值,它要么为true要么为false(参见3.1节中的“高级用户提示:Boolean返回值”部分)。我们使用这个变量来记录访问者是否正确地填写了表单。当访问者试图提交表单的时候,JavaScript检查每个表单字段,确保它们满足了设置的要求(例如,字段不为空,并且其中必须有一个E-mail地址)。如果有问题,例如字段为空,可以把valid设置为false(valid=false)。
现在,如果想要做些事情,例如显示一个错误以阻止表单提交,可以编写如下所示的一个条件语句:
if(!valid){
//print errors and don't submit form
}
条件!valid可以翻译为“如果不是valid”,这意味着,如果valid为false,那么这个条件为true。若要搞清楚使用NOT操作符的一个条件的结果,只要计算没有NOT操作符的条件,然后对其取反即可。换句话说,如果条件结果为true,!操作符将其改为false,因此,条件语句不会运行。
可以看到,NOT操作符很容易理解(用Bizarro的话来说:它很容易令人混淆,但是,如果你使用它的时间足够长,就会习惯)。