第一百零五章 switch

今天我们学习 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 部分在不需要的时候是可以省略的。

本章内容从原理角度讲解,所以可能和其他教程在说法上有所出入,正常现象,习惯就好~

原文链接:https://www.ek58.com/archives/3734,转载请注明出处。

0

评论0

请先

没有账号? 注册  忘记密码?