Jaa*_*nus 125 javascript switch-statement
我想做这样的事情
switch (this.dealer) {
case 1-4:
// Do something.
break;
case 5-8:
// Do something.
break;
case 9-11:
// Do something.
break;
default:
break;
}
Run Code Online (Sandbox Code Playgroud)
这个的正确语法是什么?在JavaScript中可以吗?
那么this.dealer是一个整数,如果它在这些值之间,那么就做一些事情.
Ale*_*tin 259
这是我想出来的另一种方式:
const x = this.dealer;
switch (true) {
case (x < 5):
alert("less than five");
break;
case (x < 9):
alert("between 5 and 8");
break;
case (x < 12):
alert("between 9 and 11");
break;
default:
alert("none");
break;
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*son 43
增加MarvinLabs的答案,使其更清洁:
var x = this.dealer;
switch (true) {
case (x < 5):
alert("less than five");
break;
case (x < 9):
alert("between 5 and 8");
break;
case (x < 12):
alert("between 9 and 11");
break;
default:
alert("none");
break;
}
Run Code Online (Sandbox Code Playgroud)
这是没有必要检查该范围的下端,因为break语句将导致执行跳过其余的情况下,使得由时间执行到达检查例如(X <9),我们知道其值必须为5或更大.
当然,如果情况保持原始顺序,输出只是正确的,我们假设整数值(如问题中所述) - 从技术上讲,范围介于5和8.999999999999左右,因为js中的所有数字实际上都是双精度浮点数点数.
如果您希望能够移动案例,或者发现它更具可读性以使每个案例语句中的全部范围可见,则只需为每个案例的较低范围添加一个小于或等于的检查:
var x = this.dealer;
switch (true) {
case (x < 5):
alert("less than five");
break;
case (x >= 5 && x < 9):
alert("between 5 and 8");
break;
case (x >= 9 && x < 12):
alert("between 9 and 11");
break;
default:
alert("none");
break;
}
Run Code Online (Sandbox Code Playgroud)
请记住,这会增加额外的人为错误点 - 有人可能会尝试更新范围,但忘记在两个地方更改它,留下未覆盖的重叠或间隙.例如,当我只编辑用于匹配8的情况时,8的情况现在将不匹配任何内容.
case (x >= 5 && x < 8):
alert("between 5 and 7");
break;
case (x >= 9 && x < 12):
alert("between 9 and 11");
break;
Run Code Online (Sandbox Code Playgroud)
Vin*_*rat 20
switch(this.dealer) {
case 1:
case 2:
case 3:
case 4:
// Do something.
break;
case 5:
case 6:
case 7:
case 8:
// Do something.
break;
default:
break;
}
Run Code Online (Sandbox Code Playgroud)
如果你不喜欢连续的案例,那就干脆去做if/else if/else陈述.
xte*_*ore 14
这并不需要一个switch语句.简单地使用if else语句会更清晰,更简洁,更快捷 ......
var d = this.dealer;
if (1 <= d && d <= 11) { // making sure in range 1..11
if (d <= 4) {
alert("1 to 4");
} else if (d <= 8) {
alert("5 to 8");
} else {
alert("9 to 11");
}
} else {
alert("not in range");
}
Run Code Online (Sandbox Code Playgroud)
速度测试
我很好奇使用开关的开销,而不是更简单的if ... else ...,所以我把一个jsFiddle放在一起检查它... http://jsfiddle.net/17x9w1eL/
Chrome:切换比其他版本慢了约70%
Firefox:切换比其他情况慢约5%
IE:开关比其他情况慢了约5%
Safari:切换比其他时间慢约95%
笔记:
分配给局部变量是可选的,特别是如果您的代码将在以后自动优化.
对于数值范围,我喜欢使用这种结构......
if (1 <= d && d <= 11) {...}
Run Code Online (Sandbox Code Playgroud)
...因为对我而言,它更接近你在数学中表达范围的方式(1 <= d <= 11),当我读代码时,我可以读到"如果d介于1和1之间11" .
更清晰
一些人评论说他们认为这不是更清楚.由于结构与开关选项接近相同,因此当然不会那么清楚.更清楚的主要原因是它的每个部分都是可读的并且简单直观,而"switch(true)"是一个相当无意义的代码行.许多程序员在你的剧本中读到这些内容,"WTF的意思是什么?" 然后必须查找它.这是一个肮脏的黑客,它不直观,而且还不清楚.如果这就是你喜欢编码的方式,而且没有其他人会不得不处理你的代码库,那就去吧,否则,最好只使用这些结构来实现它们的目的.
如果您需要检查范围,最好使用ifandelse if语句,如下所示:
if (range > 0 && range < 5)
{
// ..
}
else if (range > 5 && range < 9)
{
// ..
}
else
{
// Fall through
}
Run Code Online (Sandbox Code Playgroud)
开关可以在更大的范围内变大。