一个 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…)