我想做这样的事情
switch (this.dealer) {
case 1-4:
// Do something.
break;
case 5-8:
// Do something.
break;
case 9-11:
// Do something.
break;
default:
break;
}
正确的语法是什么?JavaScript可能吗?
所以this.dealer
是一个整数,如果它在这些值之间,请执行某些操作。
这是我想出的另一种方法:
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;
}
增加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;
}
不必检查范围的下限,因为该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;
}
请记住,这会增加一个额外的人为错误点-有人可能会尝试更新范围,但忘记在两个地方都进行更改,从而留下了无法覆盖的重叠或空白。例如,在这里,当我只编辑用于匹配8的大小写时,现在将不匹配任何8。
case (x >= 5 && x < 8):
alert("between 5 and 7");
break;
case (x >= 9 && x < 12):
alert("between 9 and 11");
break;
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;
}
如果您不喜欢一连串的案件,只需if/else if/else
声明即可。
这不需要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");
}
速度测试
我很好奇使用开关而不是更简单的if ... else ...的开销,所以我整理了一个jsFiddle来检查它...
http://jsfiddle.net/17x9w1eL/
-
Chrome:切换速度比其他方式慢70%
-
Firefox:切换速度比其他方式慢了5%
-
IE:切换速度比其他方式慢了5%
-
Safari浏览器:开关是慢约95% ,如果其他人
笔记:
分配给局部变量是可选的,尤其是在以后要自动优化代码的情况下。
对于数字范围,我喜欢使用这种构造...
if (1 <= d && d <= 11) {...}
...因为对我来说,它的读法更接近于您表达数学范围的方式(1 <= d <= 11),当我阅读代码时,我可以读为“如果d在1到1之间。 11“。
更清晰
少数人认为这不太清楚。我想说的不是很清楚,因为其结构与switch选项几乎相同。更清晰的主要原因是它的每个部分都是可读的,并且具有简单直观的意义。
我对“ switch(true)”的关注是,它看起来像是毫无意义的代码行。许多编码器,阅读后会不知道该怎么做。
对于我自己的代码,我更愿意不时使用晦涩的结构,但是如果其他人愿意看它,我会尝试使用更清晰的结构。我认为最好将其用于预期的构造。
优化
在现代环境中,通常会缩减代码的生产量,因此您可以编写清晰简洁的代码,并带有可读的变量名和有用的注释。没有明确的理由以这种方式使用开关。
我还尝试将两个构造都放入一个缩小器。if / else结构压缩得很好,使用嵌套三元运算符成为单个短表达式。最小化后的switch语句仍然是一个switch,带有“ switch”,“ case”和“ break”令牌,因此,代码的时间更长。
switch(true)如何工作
我认为“ switch(true)晦涩难懂,但似乎有些人只想使用它,所以这里解释了它为什么起作用...
一个switch / case语句的工作原理是,将switch中的部分与每个case匹配,然后在第一个匹配项上执行代码。在大多数使用情况下,我们在开关中有一个变量或非常量表达式,然后将其匹配。
使用“ switch(true)”,我们将在case语句中找到第一个表达式为true。如果将“ switch(true)”读为“ find the first expression is true”,则代码将更具可读性。
如果需要检查范围,最好使用if
andelse if
语句,例如:
if (range > 0 && range < 5)
{
// ..
}
else if (range > 5 && range < 9)
{
// ..
}
else
{
// Fall through
}
开关可能会在较大范围内变大。
三元数的可读性更高的版本可能如下所示:
var x = this.dealer;
alert(t < 1 || t > 11
? 'none'
: t < 5
? 'less than five'
: t <= 8
? 'between 5 and 8'
: 'Between 9 and 11');
不,这是不可能的。您可以获得的最接近的是:
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;
但是,这很笨拙。
对于这种情况,通常最好使用if
/else if
结构。
function sequentialSizes(val) {
var answer = "";
switch (val){
case 1:
case 2:
case 3:
case 4:
answer="Less than five";
break;
case 5:
case 6:
case 7:
case 8:
answer="less than 9";
break;
case 8:
case 10:
case 11:
answer="More than 10";
break;
}
return answer;
}
// Change this value to test you code to confirm ;)
sequentialSizes(1);
如果您想快速,高效且易读地进行操作,请使用if ... then ... else这样的标准结构:
var d = this.dealer;
if (d < 12) {
if (d < 5) {
alert("less than five");
}else if (d < 9) {
alert("between 5 and 8");
}else{
alert("between 9 and 11");
}
}else{
alert("none");
}
如果您想对其进行混淆并使其变得可怕(但很小),请尝试以下操作:
var d=this.dealer;d<12?(d<5?alert("less than five"):d<9?alert("between 5 and 8"):alert("between 9 and 11")):alert("none");
顺便说一句,上面的代码是JavaScript if ... then ... else速记语句。这是一个很好的示例,说明除非目标是混淆或代码缩小,否则不要编写代码。请注意,如果使用这种方式编写代码,则可能会成为问题。如果有的话,很少有人可以轻松阅读它。但是,如果...则代码大小比标准大小小50%,否则...不会造成任何性能损失。这意味着在较大的代码库中,像这样的最小化可以极大地加快跨带宽受限或高延迟网络的代码交付。
但是,这不应被视为一个好答案。这仅仅是可以做什么的一个例子,而不是应该做什么。
文章标签:javascript , switch-statement
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!