[代码碎片] switch还能这么玩儿

329 阅读2分钟

日常搬砖,突然看到这样一段代码,摘要如下:

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)

从语法规范上来说,并没有说明 switchcase 的表达式必须是数字、字符串、布尔值,还是其他什么值,所以 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 结构中,如果判断过于复杂或者条件语句过长,需要考虑换行、格式化代码,或者封装成函数。个人觉得 switchif 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()) 包一层。


写在最后: 虽然是一篇很简单的文章,也没啥干货,但却是我开始认真记录自己学习和成长的重要一步。没有文采,技术平平,平时疏于总结,下笔困难重重。希望自己可以在新的一年里可以克服懒惰和猥琐,坚持学习,坚持输出,踏踏实实做好每一件事。加油!