原文链接:https://javascript.info/switch,translate with ❤️ by zhangbao.
一个 switch 语句可以替换多个 if 检查。
它提供了一种更具描述性的方法来比较一个值和多个变体。
语法
switch 语句就可以有一个或者多个 case 块和一个可选的 default。
看起来像这样:
switch(x) {
case 'value1': // if (x === 'value1')
...
[break]
case 'value2': // if (x === 'value2')
...
[break]
default:
...
[break]
}
x 的值使用严格相等运算符进行比较的,从第一个 case 开始(也就是 value1),然后是第二个等等(value2)。
如果找到匹配的值后,switch 就从当前的 case 处开始执行代码,直到找到最近的 break(或者是到 switch 的结尾)。
如果没有找到匹配的话,就会执行 defalt 中的代码(如果存在的话)。
例子
一个 switch 的例子:
let a = 2 + 2;
switch (a) {
case 3:
alert( 'Too small' );
break;
case 4:
alert( 'Exactly!' );
break;
case 5:
alert( 'Too large' );
break;
default:
alert( "I don't know such values" );
}
这里的 switch 从第一个 case 开始去比较 a 是否等于 3,匹配失败。
然后是 4,匹配到了,所以执行从 case 4 开始,到最近的 break 结束。
如果没有 break 的话,执行会继续进入到下一个 case 而不会有任何检查。
一个没有 break 的例子:
let a = 2 + 2;
switch (a) {
case 3:
alert( 'Too small' );
case 4:
alert( 'Exactly!' );
case 5:
alert( 'Too big' );
default:
alert( "I don't know such values" );
}
上面的例子,我们能看到连续 3 次弹出 alert:
alert( 'Exactly!' );
alert( 'Too big' );
alert( "I don't know such values" );
⚠️switch/case 的参数可以是任意表达式
switch 和 case 都接受任意表达式作为参数。
例如:
let a = "1";
let b = 0;
switch (+a) {
case b + 1:
alert("this runs, because +a is 1, exactly equals b+1");
break;
default:
alert("this doesn't run");
}
这里 +a 得到 1,与 b + 1 这个 case 进行比较,对应的代码会遭执行。
“case”分组
分享相同代码的不同 case 变体可以组合成一个。
例如,如果我们想要一段逻辑在 case 3 和 case 5 时执行时:
let a = 2 + 2;
switch (a) {
case 4:
alert('Right!');
break;
case 3: // (*) 组合两种 case
case 5:
alert('Wrong!');
alert("Why don't you take a math class?");
break;
default:
alert('The result is strange. Really.');
}
在 3 和 5 的情况下,会显示相同的信息。
这种“分组”的实现,得益于 switch/case 在没有 break 情况下的副作用。在 case 3 的情况,由于没有 break 就穿越到了 case 5。
类型敏感的
让我们强调一下,平等检查总是严格的。这些值必须是相同类型匹配的。
例如,考虑下下面的代码:
let arg = prompt("Enter a value?")
switch (arg) {
case '0':
case '1':
alert( 'One or zero' );
break;
case '2':
alert( 'Two' );
break;
case 3:
alert( 'Never executes!' );
break;
default:
alert( 'An unknown value' )
}
对于 0,1,会执行第一个 alert。
对于 2,会执行第二个 alert。
但是对于 3,prompt 的结果是字符串 “3”,并不严格相等 === 与数值 3。因此这里不会执行 case 3!而是默认的 default 会执行。
(完)