一个 switch 语句可以替换多个 if 检查。
它提供了一种更具描述性的方式来将一个值与多个变量进行比较。
语法
switch 有一个或多个 case 块和一个可选的默认值。
它看起来像这样
switch(x) {
case 'value1': // if (x === 'value1')
...
[break]
case 'value2': // if (x === 'value2')
...
[break]
default:
...
[break]
}
x的值将与第一个case(即value1)中的值进行严格相等检查,然后与第二个(value2)进行检查,依此类推。- 如果找到相等项,
switch将从相应的case开始执行代码,直到最近的break(或switch结束)。 - 如果没有匹配的 case,则会执行
default代码(如果存在)。
一个示例
switch 的示例(执行的代码已高亮显示)
let a = 2 + 2;
switch (a) {
case 3:
alert( 'Too small' );
break;
case 4:
alert( 'Exactly!' );
break;
case 5:
alert( 'Too big' );
break;
default:
alert( "I don't know such values" );
}
此处,switch 从第一个 case 变体(即 3)开始比较 a。匹配失败。
然后是 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" );
}
在上面的示例中,我们将看到三个 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,它与 case 中的 b + 1 进行比较,然后执行相应的代码。
“case” 的分组
可以将共享相同代码的多个 case 变体分组。
例如,如果我们希望对 case 3 和 case 5 运行相同的代码
let a = 3;
switch (a) {
case 4:
alert('Right!');
break;
case 3: // (*) grouped two cases
case 5:
alert('Wrong!');
alert("Why don't you take a math class?");
break;
default:
alert('The result is strange. Really.');
}
现在,3 和 5 都显示相同的消息。
能够对 case 进行“分组”是 switch/case 在没有 break 的情况下工作方式的副作用。此处,case 3 的执行从第 (*) 行开始,然后遍历 case 5,因为没有 break。
类型很重要
让我们强调一下,相等性检查始终是严格的。值必须具有相同的类型才能匹配。
例如,我们考虑以下代码
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变体会执行。
评论
<code>标签,对于多行 - 将它们包装在<pre>标签中,对于 10 行以上 - 使用沙箱 (plnkr,jsbin,codepen…)