你至少有四个选择:
1. 列出每个 case
如LightStyle 所示,您可以明确列出每个案例:
switch(myInterval){
case 0:
case 1:
case 2:
doStuffWithFirstRange();
break;
case 3:
case 4:
case 5:
doStuffWithSecondRange();
break;
case 6:
case 7:
doStuffWithThirdRange();
break;
default:
doStuffWithAllOthers();
}
2.使用if
/ else if
/else
如果范围很大,那会变得笨拙,所以你会想要做范围。请注意,使用if...else if...else if
,如果较早的匹配,则无法访问较晚的,因此每次只需指定上限。/*...*/
为清楚起见,我将包含下限,但通常您会忽略它以避免引入维护问题(如果您包含两个边界,则很容易更改一个而忘记更改另一个):
if (myInterval < 0) {
// I'm guessing this is an error
}
else if (/* myInterval >= 0 && */ myInterval <= 2){
doStuffWithFirstRange();
}
else if (/* myInterval >= 3 && */ myInterval <= 5) {
doStuffWithSecondRange();
}
else if (/* myInterval >= 6 && */ myInterval <= 7) {
doStuffWithThirdRange();
}
else {
doStuffWithAllOthers();
}
3.case
与表达式一起使用:
JavaScript 的不同之处在于您可以在case
语句中使用表达式,因此我们可以将if...else if...else if
上面的序列写为switch
语句:
switch (true){
case myInterval < 0:
// I'm guessing this is an error
break;
case /* myInterval >= 0 && */ myInterval <= 2:
doStuffWithFirstRange();
break;
case /* myInterval >= 3 && */ myInterval <= 5:
doStuffWithSecondRange();
break;
case /* myInterval >= 6 && */ myInterval <= 7:
doStuffWithThirdRange();
break;
default:
doStuffWithAllOthers();
}
我不提倡这样做,但它是JavaScript 中的一个选项,有时它很有用。这些case
语句按照您在switch
. (同样,在许多情况下可以省略下界,因为它们会更早地匹配。)即使case
s 是按源代码顺序处理的,default
也可以出现在任何地方(不仅仅是在最后),并且只有在没有的情况下才会被处理case
s 匹配或case
匹配并落入默认值(没有break
;您很少想这样做,但它发生了)。
4. 使用调度图
如果您的函数都采用相同的参数(并且可以没有参数,或者只是相同的参数),另一种方法是调度映射:
在一些设置代码中:
var dispatcher = {
0: doStuffWithFirstRange,
1: doStuffWithFirstRange,
2: doStuffWithFirstRange,
3: doStuffWithSecondRange,
4: doStuffWithSecondRange,
5: doStuffWithSecondRange,
6: doStuffWithThirdRange,
7: doStuffWithThirdRange
};
然后代替开关:
(dispatcher[myInterval] || doStuffWithAllOthers)();
这是通过在dispatcher
地图上查找要调用的函数来实现的,doStuffWithAllOthers
如果myInterval
使用功能强大的||
运算符没有该特定值的条目,则默认为,然后调用它。
你可以把它分成两行,让它更清楚一点:
var f = dispatcher[myInterval] || doStuffWithAllOthers;
f();
我使用了一个对象以获得最大的灵活性。你可以dispatcher
用你的具体例子这样定义:
var dispatcher = [
/* 0-2 */
doStuffWithFirstRange,
doStuffWithFirstRange,
doStuffWithFirstRange,
/* 3-5 */
doStuffWithSecondRange,
doStuffWithSecondRange,
doStuffWithSecondRange,
/* 6-7 */
doStuffWithThirdRange,
doStuffWithThirdRange
];
...但如果值不是连续的数字,则使用对象来代替会更清晰。