浅析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的主要内容,如果未能解决你的问题,请参考以下文章
java 导航抽屉切换活动而不是片段。字体:https://stackoverflow.com/questions/19442378/navigation-drawer-to-switch-