浅析switch

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析switch相关的知识,希望对你有一定的参考价值。

先声明下:本文中的switch仅限于JS,我并未查阅过其他编程语言中switch的语法,但有朋友反映在OC中并不适用!

一、switch语句基础概念

  属于选择结构,一般用于选择要执行的多个代码块之一。

基本语法

switch(expression) {
case value1: 执行代码块 1 break; case value2: 执行代码块 2 break; default: 表达式,与 case 1 和 case 2 不同时执行的代码 }

 

  工作原理:首先设置表达式 ,通常是一个变量。随后表达式的值会与结构中的每个 case 的值做比较。如果存在匹配,则与该 case 关联的代码块会被执行。可以使用break来阻止代码向下一个case执行。

 

二、switch的应用

  好的,根据以上的概念,switch可以用于对表达式的值进行简单判断,并执行不同情况的代码块。

 

  例如以下这种简单的情况:

 1 //判断今天是星期几
 2 
 3 var day=new Date().getDay();
 4 
 5 switch (day)
 7 {
 9 case 0: 
11   x="Today it‘s Sunday";
13   break;
15 case 1:
17   x="Today it‘s Monday";
19   break;
21 case 2:
23   x="Today it‘s Tuesday";
25   break;
27 case 3:
29   x="Today it‘s Wednesday";
31   break;
33 case 4:
35   x="Today it‘s Thursday";
37   break;
39 case 5:
41   x="Today it‘s Friday";
43   break;
45 case 6:
47   x="Today it‘s Saturday";
49   break;
51 }

      

   看起来,并没有if语句用着方便。因为,似乎case只能设置常量,对范围值的判断并没有if语句出色,但是请看下面的例子:

 1 var num = parseInt(window.prompt(‘输入成绩‘));
 2 
 3 switch(true)
 5 {
 7   case num>=90 && num<=100:
 8 
 9     alert(‘A‘);
11     break;
12 
13   case num>=80 && num<90:
14 
15     alert(‘B‘);
17     break;
18 
19     default:
20 
21        alert(‘C‘);
23        break;
25 }

 

  这个例子或许会让人心生疑惑,为什么case后又能设置表达式呢,而且可以正确判断呢,这又必须从switch的工作原理开始说起。

三、switch的工作原理

  先回顾一下switch的工作原理:

  首先设置表达式 ,通常是一个变量。随后表达式的值会与结构中的每个 case 的值做比较。如果存在匹配,则与该 case 关联的代码块会被执行。可以使用break来阻止代码向下一个case执行。

  这段话摘自w3school关于switch的介绍,原文并没有什么问题,但是我们经常忽略的一个地方是 case 的值!在《javascript高级程序设计》一书中,对 case 的定义是value(值),这也很容易让人误解为一个常量,当然,书中也介绍了 case 用表达式的情况,但却并未具体说明。

  那么,case到底可以设置什么呢?其实,查阅ECMA后,一切就很清楚了:

switch(Expression) CaseBlock

CaseClause:case Expression:

Return Normal  Completion(empty).

CaseClause:case Expression:StatementList

Return the result of evaluating StatementList.

DefaultClause:default:

Return Normal  Completion(empty).

DefaultClause:default:StatementList

Return the result of evaluating StatementList.

  摘自——ECMA-262

  先不管那些看不明白的英文,锁定一个关键词“Expression”——表达式,这下就清楚了, case 后面也可以跟表达式!

 

  现在,让我们再梳理一次switch的工作原理:

  1.switch(expression)先获取expression的值作为引用;

  2.逐个case遍历,计算表达式,表达式的值并不会影响switch判断的基准,因为第一步已经获取了引用;

  3.若匹配case,就执行匹配case的代码块,若带终止(如break)的话,就停止遍历剩下的case。

  4.若无匹配的case,case将全部遍历一遍。

 

  知道了工作原理,让我们再来看看上一个例子:

 1 var num = 70;
 2 
 3 switch(true)  //引用true的值
 5 {
 7   case num>=90 && num<=100: //遍历case1,计算表达式,表达式值为false,两个值不全等,继续遍历下一项
 9     alert(‘A‘);
11     break;
13   case num>=80 && num<90:  //遍历case2,计算表达式,表达式值为false,两个值不全等,继续遍历下一项
14     alert(‘B‘);
15     break;
16   default:                //以上case都不满足,执行此处代码块
18     alert(‘C‘);
20     break;
22 }
23 
24 //执行结果: alert(‘C‘);

 

  讲到这里,相信大家对switch有更深入了理解了,或许可以试试下面的例子:

 1 var num = 4;
 2 
 3 switch (num)
 5 {
 7   case num = 1:           
 9     alert("1");
11     break; 
13   case num = 1:
15     alert("1");
17     break; 
19   case num = 3: 
21     alert("3");
23     break;
25   default:
27     alert("以上都不执行");
29     alert(num);
31   break;
33 }
36 
37 //执行结果:以上都不执行,3

 

 

  咦,为什么会执行default中的代码呢,在case1中,num被赋值为1了,那么num值与case2相等,应该执行case2中的代码呀?其实,再往上翻翻,看看switch的工作原理的第一句:switch(expression)先获取expression的值作为引用。

  这表示,switch是引用num的值,所以在接下来case中,对num赋值的操作并不会影响switch在第一步中的引用值。

 

  上一道例题的工作原理就可以解析为下面几步了:

  1、引用num的值:4;

  2、遍历case1,计算表达式,表达式num被赋值为1,两个值不全等,继续遍历下一项;

  此处,num值被重新赋值为1后,switch判断的基准值依然是4,因为判断基准是引用自num的值,在第一步已经获取了引用,所以在接下来的遍历中,case中对num的赋值操作,并不会影响switch的判断基准值;

  3、遍历case2,计算表达式,表达式num被赋值为1,两个值不全等,继续遍历下一项;

  4、遍历case2,计算表达式,表达式num被赋值为3,两个值不全等,继续遍历下一项;

  5、以上结果都不匹配,执行此处代码,此时,num的值为3。

 

  OK,写到这里,大家应该对switch有了一定的理解,如果还想更深入的了解switch,建议去学习ECMA的相关资料!

 

结束语

  这是JS菜鸟——本人对switch的理解,如果有什么写得不对的地方,欢迎大家指正!

以上是关于浅析switch的主要内容,如果未能解决你的问题,请参考以下文章

浅析 Python 模块

浅析普通函数与构造函数

浅析XSS的几种测试方法

java 导航抽屉切换活动而不是片段。字体:https://stackoverflow.com/questions/19442378/navigation-drawer-to-switch-

TypeScript: switch enum

线程浅析