14.6.3 switch语句

编写条件语句的方法不止一种。尽管根据一个条件的结果给一个变量赋值的时候三元操作符很好用,但是switch语句是根据一个单个变量的值编写一系列if/else语句的一种更为紧凑的方法。

例如,假设我们要求站点的访问者在一个表单字段中输入他们喜爱的颜色,然后,根据他们提交的颜色而显示一条不同的信息。如下是使用典型的条件语句编写的代码:


if(favoriteColor=='blue'){

message='Blue is a cool color.’;

}else if(favoriteColor=='red'){

message='Red is a warm color.’;

}else if(favoriteColor=='green'){

message='Green is the color of the leaves.’;

}else{

message='What kind of favorite color is that?’;

}


注意,这段代码中有那么多的favoriteColor=='some value'。实际上,'favoriteColor==’在仅仅9行代码中出现了3次。如果我们所做的只是重复地测试一个变量的值,那么,switch语句提供了一种更为优雅(并且容易阅读)的解决方案。一条switch语句的基本结构如图14-2所示。

14.6.3 switch语句 - 图1

图 14-7 switch语句是根据一个变量的值来执行不同操作的一种紧凑方式。不要忘掉了每个case末尾的break;语句,这条break;语句使得我们能够退出switch语句

switch语句的第1行从关键字switch开始,接着是圆括号中的一个变量名,后面跟着一个开始的花括号。基本上,这段代码是说“让我们获取这个变量的值,看看它是否匹配几个其他值中的一个”。每次测试叫做一个case,并且一条switch语句有一个或多个case。例如,在图14-2中,有3个case,编号为1~3。一个case的基本结构如下所示:


case value1:

//do something

break;


关键字case表示这是一个case的开始,后面跟着某个值,然后是一个冒号。这行代码是较长的if(variable=='value1')的简写方式。这个值可能是一个数字、字符串或者布尔值(或者包含了一个数值、字符串或布尔值的变量),因此,如果想要测试该变量是否等于37,那么,这个case如下所示:


case 37:

//do something

break;


要测试该变量为true或false,可以这样编写代码:


case true:

//do something

break;


在第1行代码之后,我们添加了如果变量匹配了测试的case值时想要执行的语句。最后,添加了一条break;语句。这个步骤很重要,break;语句退出了switch语句。如果漏掉了break;语句,JavaScript解释器将会跳到下一个测试case并看它是否匹配。特别是,如果我们在一条switch语句中使用了最后的default关键字(参见图14-7中的4),漏掉break;语句可能会导致问题。如果没有测试case为真,就使用default语句,因此,它等同于一个条件语句中的最后的else子句。如果我们在前面的一个测试case中漏掉了break;语句,并且有一个case为true, JavaScript解释器仍然会运行default语句中列出的所有代码。

下面是如何使用switch语句来编写本小节前面给出的if/else if代码:


switch(favoriteColor){

case'blue':

message='Blue is a cool color.’;

break;

case'red':

message='Red is a warm color.’;

break;

case'green':

message='Green is the color of the leaves.’;

break;

default:

message='What kind of favorite color is that?’;

}


这段代码等同于前面的if/else if代码,但是它更加紧凑而且容易阅读。

实际上,如果想要对几个值运行同样的代码,也可以把多条case语句紧挨着放在一起(并且故意不包括default关键字)。例如:


switch(favoriteColor){

case'navy':

case'blue':

case'indigo':

message='Blue is a cool color.’;

break;

case'red':

message='Red is a warm color.’;

break;

case'green':

message='Green is the color of the leaves.’;

break;

default:

message='What kind of favorite color is that?’;

}


这类似于在一条if/else语句中使用(favoriteColor=='navy'||favoriteColor=='blue'||favoriteColor=='indigo')。