日常搬砖,突然看到这样一段代码,摘要如下:
switch (true) {
default:
case EXPRESSION1:
callback( 1 );
break;
case EXPRESSION2:
callback( 2 );
break;
case EXPRESSION3:
callback( 3 );
break;
}
也是第一次见到 switch (true)
这种写法,觉得很有意思。按个人习惯,这里肯定会写成 if else
的结构。
那这种写法是否可取?
与 if else
结构相比又有什么优势呢?
ECMA-262规范
www.ecma-international.org/ecma-262/5.…
SwitchStatement :
switch ( Expression ) CaseBlock
CaseBlock :
{ CaseClauses(opt) }
{ CaseClauses(opt) DefaultClause CaseClauses(opt) }
CaseClauses :
CaseClause
CaseClauses CaseClause
CaseClause :
case Expression : StatementList(opt)
DefaultClause :
default : StatementList(opt)
从语法规范上来说,并没有说明 switch
或 case
的表达式必须是数字、字符串、布尔值,还是其他什么值,所以 true 肯定是合规的。
两种写法
一般我们使用 switch
语句来选择多个需被执行的代码块之一。
1、多种可能值的情况
switch (expression) {
case value1:
break;
case value2:
break;
default:
break;
}
2、复杂条件和变量情况
switch (TRUE()) {
case booleanexpression1:
break;
case booleanexpression2:
break;
default:
break;
}
3、选择
- 在
if else
结构中,如果判断过于复杂或者条件语句过长,需要考虑换行、格式化代码,或者封装成函数。个人觉得switch
与if else
相比,不管是在多种可能值条件下,还是复杂条件和变量情况下,可读性都更强,更加直观。 - 判断条件是否相等时,推荐用第一种写法;判断条件是个范围,存在大于小于的情况,推荐第二种写法;
需要注意
1、switch
的特点
- 如果多种 case 匹配一个 case 值,则选择第一个 case;
- 如果未找到匹配的 case,程序将继续使用默认 label;
- 如果未找到默认 label,程序将继续 switch 后的语句。
2、switch case
使用严格比较(===)
举个栗子:
switch (true) { case true: console.log("CORRECT"); } // 会打印CORRECT
switch (true) { case 1: console.log("WRONG"); } // 不会打印WRONG
只有操作数属于同一类型时,严格比较才能为 true。
这会导致容易出错,比如一个函数返回值不能确定就是 true,最好用 Boolean(func())
包一层。
写在最后: 虽然是一篇很简单的文章,也没啥干货,但却是我开始认真记录自己学习和成长的重要一步。没有文采,技术平平,平时疏于总结,下笔困难重重。希望自己可以在新的一年里可以克服懒惰和猥琐,坚持学习,坚持输出,踏踏实实做好每一件事。加油!