今天我们学习 switch
,那位闻言掏出了游戏机的同学,麻烦你把游戏机借给我玩十年先。
嗯,是同一个单词,但是我们这个是全小写,那个游戏机首字母大写。我们说过:JS 对大小写敏感,所以,这两个完全不一样,论证成功,哦耶~
前面学习了 if……else……
语句,如果把它串联呢,就可以处理多分支的情况了,比如我们前面的例子:
const val = +prompt('请输入你的分数:');if(val===100){console.log('学霸!');}else if(val>95){console.log('优秀!');}else if(val>80){console.log('良好!');}else if(val>60){console.log('尚可!');}else if(val>55){console.log('加油!');}else if(val>36){console.log('潜力!');}else{console.log('头疼!');}
那么想一下,这段代码是如何工作的呢?它是从前往后,逐个条件进行判断,直到条件成立。所以如果输入的分数低于 36,那么它会将所有的条件都判断一遍,这样效率就非常低了。
我们还会遇到更复杂的情况,增加的运算量也就更多,这是一个显而易见的浪费,所以应该对它进行优化。如果,我们能换一个思路的话,为什么每次判断只有两个分支?如果有多个分支的话,效率岂不更高?
有的地方对于学生作业的评价采用五分制,那么我们以此为例:
const val = +prompt('请输入你的分数(1 - 5):');switch(val){case 5:console.log('厉害呢~');break;case 4:console.log('不错呢~');break;case 3:console.log('还行呢~');break;case 2:console.log('哈哈哈~');break;case 1:console.log('喵喵喵~');break;default:console.log('你怕是搞错了什么呢~');}
格式很简单,我们来讲一下它都做了一些什么:
switch
后面的小括号里是一个算式,计算出一个结果(当然也可以直接就是一个值,一个变量……);- 然后拿着这个结果往下找,哪个
case
后面的值和这个结果相同(注意,这个比较使用的是全等于===
),就从哪里开始向下执行; - 而执行到
break
就终止(彻底跳出); - 如果全不符合则执行
default
部分。
这里要注意,如果你没在每个 case
结束后用 break
进行跳出,则会一直执行到大括号结束为止。
所以在本质上,switch
是一个跳转(goto
),根据算式,跳转到对应的某一行代码开始执行。
注意:跳转是在编程中很不建议使用的一个方法,因为可能导致代码十分混乱。毕竟我们前面的代码都是线性的,很容易理出执行的顺序,但是如果可以随意跳转,那就完全是另一种情况了。对于 switch
,也要慎重使用,避免混乱。
现在我们就学会了 switch
的用法,但是有的同学可能觉得它局限性很大,毕竟我们第一个例子判断的是范围,而第二个例子是确定的值。如果用 switch
判断范围的话:
switch(1>2){case true:……break;case false:……break;}
就剩下两种情况了,成立或者不成立,连写 default
的必要性都没有。这么麻烦,还不如回去用 if……else……
算了。
如果换个思路呢:
const val = +prompt('请输入你的分数(0 - 100):');switch(true){case val===100:console.log('厉害呢~');break;case val>=90:console.log('不错呢~');break;case val>=80:console.log('还行呢~');break;case val>=60:console.log('哈哈哈~');break;case val>= 36:console.log('喵喵喵~');break;default:console.log('你怕是搞错了什么呢~');}
把式子和结果的位置换一下,预期结果 true
放在小括号里,而式子放在 case
里面,这样我们就可以写下多个式子了。那么注意,在上面例子中,可能有多个式子的结果为 true
,但只执行第一个为真的 case
。
这就是简单的多分支处理,以及如何进行范围条件的判断。大家应该也看出来了,default
部分在不需要的时候是可以省略的。
本章内容从原理角度讲解,所以可能和其他教程在说法上有所出入,正常现象,习惯就好~
暂无评论内容