在JavaScript中切换整数范围

时间:2011-04-11 10:15:17

标签: 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;
    }

这是什么语法?是否可以在JavaScript中使用?

所以this.dealer是一个整数,如果它在这些值之间,那就做点什么。

9 个答案:

答案 0 :(得分:237)

这是我想出来的另一种方式:

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;
}

答案 1 :(得分:41)

增加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中的所有数字实际上是双-precision浮点数。

如果您希望能够移动案例,或者发现它们更具可读性,以便在每个案例陈述中显示全范围,只需为每个案例的较低范围添加一个小于或等于的检查:

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;

答案 2 :(得分: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;
    }

如果您不喜欢连续的案例,只需查看if/else if/else语句。

答案 3 :(得分:17)

需要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&lt; = d&lt; = 11),当我读取代码时,我可以读到&#34;如果d在1到11之间,则为#34;

<强>更明确的

有些人评论说他们并不认为这更清楚。由于结构与开关选项接近相同,因此当然不会那么清楚。 更清晰的主要原因是它的每个部分都是可读的并且具有简单直观的感觉,而&#34;切换(真实)&#34;是一个相当无意义的代码行。许多程序员,在你的剧本中读到这些内容,将会发生这种情况?WTF的意思是什么?&#34;然后必须查找它。 这是一个肮脏的黑客,它不直观,而且不清楚。如果这就是你喜欢编码的方式,而且其他任何人都不需要处理你的代码库,那就去吧,否则,最好只使用这些结构来实现它们是什么意图。

答案 4 :(得分:2)

不,这是不可能的。你能得到的最接近的是:

  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结构。

答案 5 :(得分:2)

如果您需要检查范围,最好使用ifelse if语句,例如:

if (range > 0 && range < 5)
{
    // ..
}
else if (range > 5 && range < 9)
{
    // ..
}
else
{
    // Fall through
}

开关可能会在更大范围内变大。

答案 6 :(得分:0)

如果您尝试快速,高效和可读地执行某些操作,请使用标准if ... then ... else结构,如下所示:

hidden

如果你想混淆它并使其变得糟糕(但很小),试试这个:

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");
}
顺便说一下,上面的代码是一个JavaScript if ... then ... else简写语句。它是如何编写代码的一个很好的例子,除非混淆或代码缩小是目标。请注意,如果以这种方式编写代码维护可能会成为问题。如果有的话,很少有人能够轻松地阅读它。但是,代码大小比标准小50%,如果...那么......其他没有任何性能损失。这意味着在更大的代码库中,像这样的缩小可以极大地加速跨带宽约束或高延迟网络的代码传递。

但是,这不应该被认为是一个好的答案。这只是可以做什么的一个例子,而不应该做什么。

答案 7 :(得分:0)

三元组的可读性更高的版本可能如下所示:

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');

答案 8 :(得分:0)

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);