【问题标题】:Switch Statement with range value具有范围值的 Switch 语句
【发布时间】:2014-02-26 11:34:58
【问题描述】:

我在 JS 文件中编写 swtich javascript switch 语句,发现问题一整天仍然找不到解决方案。

这是我用 jQuery 编写的 javascript 文件:

var percent = 20;
var widthbytes;
switch(percent)
{
case 0:
   widthbytes=0;
   break;
    case (percent > 10 && percent < 20):
   widthbytes=16;
   break;
    case (percent >=20 && percent < 30):
       widthbytes=30;
       break;
default:
       widthbytes=0;
       break;
}
average.width(widthbytes);

它总是返回默认值而不是 30。我的代码有什么问题吗?

【问题讨论】:

  • 这行不通。请改用简单的 if-else 表达式。
  • 你不能这样写。使用if/elsereversed switch,虽然我不推荐后者。

标签: javascript switch-statement


【解决方案1】:

switch 语句只检查变量的值,然后根据该值给出结果,所以你的表达式

case (percent > 10 && percent < 20):

返回与变量值不可比较的布尔值。使用 if-else 完成工作。

【讨论】:

    【解决方案2】:

    只需对您的代码进行一些更改。 您的代码中有 switch(percent)**,仅针对此 ***switch(true)* 进行更改。

    因为 switch 语句返回一个布尔值,这就是为什么我们需要它们具有相同的比较,即 boolean vrs boolean。

    例如案例10:返回一个值;真假。

    【讨论】:

      【解决方案3】:

      我看不出@Carlos Marin 的回答有问题。这有效:-

      var percent = 10; //test values-> 10, 11, 19, 20, 21, 29, 30
      var widthbytes;
      
      switch(true){
      // case 0:
      //    widthbytes=0;
      //    break;
      case (percent > 10 && percent < 20):
         widthbytes=16;
         break;
      case (percent >=20 && percent < 30):
         widthbytes=30;
         break;
      default:
         widthbytes=0;
         break;
      }
      
      console.log(widthbytes);
      

      【讨论】:

        【解决方案4】:

        switch 语句不是这样工作的。您的第二种情况是这样检查的:if (percent == (percent &gt; 10 &amp;&amp; percent &lt; 20)) ...,这不会产生预期的结果。

        您可以使用 if / elseif / else 构造:

        if (percent === 0) {
          widthbytes = 0;
        } else if (percent > 10 && percent < 20 {
          widthbytes = 16;
        } else if (percent >= 20 && percent < 30 {
          widthbytes = 30;
        } else {
          widthbytes = 0;
        }
        

        或者您可以使用将范围转换为常量的函数:

        function getRange(percent) {
          return Math.floor(percent/10);
        }
        
        switch(getRange(percent)) {
          case 10:
            widthbytes = 16;
            break;
          case 20:
            widthbytes = 30;
            break;
          default: 
            widthbytes = 0;  
        }
        

        请注意,为了获得更简洁的实现,我将原始案例 0: 同化为默认值,因为它们都做同样的事情。如果不希望这样做,您需要更改 getRange 函数,使其不再返回与 0 和 10 之间的任何数字相同的范围。

        【讨论】:

          最近更新 更多