购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.1 条件语句之if语句

if语句在JavaScript中是最常用的语句,是一种基础的控制语句,可以让代码选择性执行。简单地说,就是给出一个条件,使计算机判断是否满足该条件,并且按照不同的判断结果进行不同处理。if语句一般分为单分支、双分支和多分支三种形式。本节对这三种形式分别进行讲解。

5.1.1 单分支if语句和双分支if语句

if语句用来实现条件分支,使计算机根据条件选择性地执行某些语句。比如,判断a是否等于b,就可以通过if语句实现:

if代表“如果”的意思,这段代码的意思显而易见,如果a等于b,则输出“相等”;如果a不等于b,就什么都不输出。因为a和b的值都为22,所以输出“相等”。

类似这段代码只描述测试条件为true的情况,我们称其为单分支if语句。简单地说,单分支if语句只有一条选择语句,如果符合条件,就执行选择语句中的代码;如果不符合条件,就不执行选择语句中的代码,而是继续向下执行。单分支if语句的语法如下:

可以将单分支if语句执行流程总结为以下三步。

第一步:计算小括号中的结果。

第二步:如果结果不是布尔值,则转换为对应的布尔值。

第三步:如果结果为true,则执行大括号内的代码块,反之则不执行大括号内的代码块。

单分支if语句执行流程图如图5-1所示。

图5-1 单分支if语句执行流程图

下面来看一个单分支if语句的案例,要求实现根据家产决定是否环游世界。

这段代码通过if语句判断家产是否大于100万元。当家产大于100万元时,就先执行大括号内的内容,再执行后面的语句;否则直接执行后面的语句。在起始部分,定义变量money并将其赋值为1500000,条件表达式“1500000>1000000”成立,先执行大括号内的内容,输出“带你去东京和巴黎~”,然后执行后面的语句,输出“我很开心”。

需要注意的是,要正确书写小括号和大括号,并且习惯上大括号中的语句应该缩进。其实,当代码块中的语句只有一行代码时,相应代码块的大括号可以被省略,上面的案例可以更改为:

这样的书写是合法的。注意,仅当代码块中的语句是一行时,才能省略大括号;省略大括号后,代码也可以不换行。而当代码块中的语句超过一行时,则不能省略大括号。比如:

这被称为单行if语句,也是合法语句。不过,业界普遍推崇的最佳实践是无论代码块中的代码有几行,都必须始终使用大括号,并保证代码有合理换行和缩进,这样可以让代码的可读性增强。

双分支if语句与单分支if语句不同,它有两条选择语句,语法如下:

双分支if语句如果不满足第一个条件,就先执行else代码块中的内容,然后向下执行其他代码块。换句话说,必须先在if语句和else语句中选择一个,再向下执行代码。

这里将双分支if语句执行流程总结为以下三步。

第一步:计算小括号中的结果。

第二步:如果结果不是布尔值,则转换为对应的布尔值。

第三步:如果结果为true,则执行大括号内的代码块,反之则不执行大括号内的代码块。

双分支if语句执行流程图如图5-2所示。

图5-2 双分支if语句执行流程图

下面来看一个双分支if语句的案例,要求实现通过年龄来判断是否成年。

if是“如果”的意思,else是“否则”的意思。这段代码的意思显而易见:判断年龄是否大于或等于18周岁,如果是则输出“你成年了”,否则输出“你未成年”。因为给定的变量age的值为22,“age>=18”成立,所以输出“你成年了”。

双分支if语句也可以省略大括号,改写上面案例为以下形式:

运行代码后可以发现,和上面案例的输出结果相同:“你成年了”。

与单分支if语句相同,双分支if语句同样可以实现单行if语句,但是我们并不建议使用这种方式,代码如下:

还记得4.5节提到的条件运算符吗?条件运算符的本质其实就是双分支if语句。但是需要注意的是,当双分支if语句的每个分支当中只有一条语句的时候,才能将双分支if语句改写为条件表达式。将上面的代码改写为条件表达式的形式:

使用条件表达式后,通过判断表达式“age>=18”的结果来决定执行哪个代码块。在初始时,将变量age赋值为22,表达式“age>=18”成立,故执行“:”前的代码,输出“你成年了”。

5.1.2 多分支if语句

在if语句中可以添加若干else if语句,这被称为“多分支if语句”。语法如下:

多分支if语句有多条选择语句,它从上到下依次判断if后的小括号中的值是否为真,如果值为真,就执行相应大括号中的代码块,其他语句不再执行。

可以将多分支if语句执行流程总结为以下四步。

第一步:计算小括号中表达式的结果。

第二步:如果结果不是布尔值,则转换为对应的布尔值。

第三步:如果结果为true,则执行大括号中的代码块,否则不执行。

第四步:如果if和所有else if后的小括号内的最终值都是false,则执行else大括号中的代码块,如果没有代码块,else可以省略不写。

注意:如果有else部分,则它必须位于整个if语句块的最后。

多分支if语句执行流程图如图5-3所示。

图5-3 多分支if语句执行流程图

下面来看一个多分支if语句的案例:

这段代码使用多分支if语句判断变量weight属于哪个区间,如果其在70和90之间,则执行对应大括号内的代码;如果其在90和120之间,则执行对应大括号内的代码;如果其在120和160之间,则执行对应大括号内的代码;如果其在160和200之间,则执行对应大括号内的代码;如果其在200和300之间,则执行对应大括号内的代码;当这些条件都不满足时,则执行else语句中的内容“您输入的体重不合法,是0到300之间”。

需要注意的是,如果满足任意条件,则只执行对应大括号中的内容,不会继续判断。这一特点也被开发者们形象地称为“跳楼现象”:将if语句体比作一个大厦,“小人儿”从楼顶开始下楼,每次测试某个条件的真假。如果条件是false,则向下走一层并测试该楼层;如果条件为true,则会立即跳楼,不再测试其他楼层。简单来说,if语句至多只执行一个分支,如图5-4所示。

图5-4 跳楼现象

再结合上面的代码来看,在初始时,weight的值为110,不符合第一个测试条件“weight>=70&&weight<90”,则向下执行第二个测试条件“weight>=90&&weight<120”,结果为true。进入对应的大括号中,执行语句“console.log("性感美~")”,输出“性感美~”,不再进行下面的判断。

5.1.3 if语句的嵌套

if语句可以嵌套使用,即某个分支中还可以有分支,且嵌套深度没有限制。

请思考题目:用户分别输入三个数字,计算其中的最大值,不考虑输入相同数字的情况。

这个题目看似简单,实际上很考验编程者的逻辑缜密性。分别用a、b、c表示用户输入的三个数字,容易想到先判断a>b是否成立,关键问题是再判断什么呢?你可以尝试先自行在纸上推演一下。

正确的算法思想是先判断a>c是否成立,此时可能:

(1)若a>b是true,那么紧接着判断a>c的情况。如果a>c是true,就能知道a是最大的;如果a>c是false,就能知道c是最大的,如图5-5(a)所示。

(2)若a>b是false,那么紧接着判断b>c的情况。如果b>c是true,就能知道b是最大的;如果b>c是false,就能知道c是最大的,如图5-5(b)所示。

图5-5 求三个数字中的最大值的算法思路

根据这个思路写出下面代码:

这段代码是通过嵌套语法实现的,但是非常不容易想到,并且思维逻辑很长,需要借助纸笔推演。更好地实现本题的方式是使用多分支if语句,代码如下:

这段代码并没有使用if语句的嵌套,而是使用了多分支if语句,考虑到了全部情况:a最大时,条件就是“a>b&&a>c”;b最大时,条件就是“b>a&&b>c”;c最大时,就是“c>a&&c>b”。这样的代码非常干净、直观,是实际开发中推崇的。其实在书写if语句时,是使用多分支if语句“盖楼”?还是使用if语句的嵌套?这需要具体情况具体分析。

在实际工作中,工程师始终推崇使用可读性高的代码,即使使用这种方法的效率可能差一些,但也更愿意使用它。

5.1.4 案例:考试成绩分档

题目:请用户输入考试成绩(0~100),并根据表5-1输出成绩档次。无须考虑用户输入数值的有效性。

表5-1 成绩分档对照表

先直接给出题目的正确解法:

在这段代码中,首先使用prompt()函数接收用户输入的数值,并使用Number()函数将其转为数值型。然后“搭建”了一个“高高的if语句大楼”。这段if语句的意思显而易见:当score>=85为真时,则输出“优秀”;当score>=70为真时,则输出“良好”;当score>=60为真时,则输出“及格”;如果都不符合,则输出“不及格”。

上面这段代码是正确的,但初学者往往会认为else if()分支书写有错误,比如,成绩为70到84之间才是良好,那为什么条件只写了score>=70呢?即初学者认为代码应该这样写:

这段代码也是正确的,但非常啰唆。这段代码给“良好”这个分支补充了一个“&&score<85”条件,这样就代表当分数大于或等于70且小于85时,成绩分档是“良好”。看似这个“且”运算让逻辑更严密,但实际上是没有必要的。这是因为当遇见if语句体时,当且仅当前面的条件表达式不满足时,才测试后面的条件表达式。比如,当测试score>=70时,一定是之前测试score>=85不满足时才进行的。换句话说,当测试到score>=70时,已经暗含成绩一定小于85。因此,补充“&&score<85”是画蛇添足的。

只有当多分支if语句靠前的条件表达式为false时,才会测试后面的条件表达式。这就意味着测试到当前条件表达式时,之前的所有条件表达式一定均为false。一旦某个条件表达式的测试结果是true时,则立即退出if语句体,不再测试后面的语句。

将代码改写为下面的写法:

这段代码也是正确的,并且精简高效,没有冗余的“且”运算。之前书写的代码是按照“优秀→良好→及格→不及格”的顺序书写的,这段代码改为了“不及格→及格→良好→优秀”的顺序。当score < 60时,则输出“不及格”;当score<70时,则输出“及格”,以此类推。注意,当判断score<70时,已经暗含条件score<60不满足了,因此无须画蛇添足写为“score<70&&score>=60”。

这两种情况的代码示意图如图5-6所示。

图5-6 这两种情况的代码示意图

下面再次改写考试成绩分档案例,请判断这段代码是否正确:

这段代码是错误的,虽然这也是按照“不及格→及格→良好→优秀”的顺序书写的,但这里使用的是大于号。也就是说,当用户输入任何一个合理数值时,第一个判断条件“score>=0”一定为true。因此无论用户输入什么数值,一定会输出“不及格”,而不会输出其他文字。而后面的测试条件,如“score>=60”,执行它的先决条件是“score>=0”为false,这在数学上是矛盾的,一个数怎么可能在<0的同时≥60呢?

从本例可见,书写多分支if语句时一定要注意:

· 表达式要力求精简,当测试某个条件时,暗含它之前的所有测试条件均为false,这样可以少些冗余代码。

· if语句一定要逻辑严密,不要出现前后矛盾的情况。 4Bfnq51CoSNDYEETD0Hu+WowU2YLBBsWtwwWmmzCOS0iijBdR7j0h7Fzqnf7yZ23

点击中间区域
呼出菜单
上一章
目录
下一章
×