【问题标题】:Javascript case statement in the switch Statementswitch 语句中的 Javascript case 语句
【发布时间】:2013-09-24 21:26:43
【问题描述】:

我在 java 脚本中的 'switch' 语句中的 'case' 语句有问题。 我的问题是如何在“case”语句中编写多个数字并节省为每个数字编写多个命令的所有工作,我会尝试更好地解释自己。我想在案例陈述中写下 数字 10-14 (10,11,12,13,14)。 我该怎么写? 感谢您的帮助,并为我的英语不好感到抱歉。

name = prompt("What's your name?")  
switch (name)  
{  
    case "Ori":  
        document.write("<h1>" + "Hello there Ori" + "<br>")  
        break;  

    case "Daniel":  
        document.write("<h1>" + "Hi, Daniel." + "<br>")  
        break;  

    case "Noa":  
        document.write("<h1>" + "Noa!" + "<br>")  
        break;  

    case "Tal":  
        document.write("<h1>" + "Hey, Tal!" + "<br>")  
        break;  

    default:  
        document.write("<h1>" + name + "<br>")  
}  
age = prompt ("What's your age?")
switch (age)
{
case  "10":
document.write("you are too little" + name)
break;

case "14":
document.write("So , you are in junior high school" + name)
break;

case  "18":
document.write("You are a grown man" + name)
break;

default:
document.write("That's cool" + name)
break;
}

【问题讨论】:

    标签: javascript variables switch-statement case var


    【解决方案1】:

    使用这个,如果你不提供break,那么控制就会下降,这样你就可以匹配switch中的一组数字。

    case 10:
    case 11:
    case 12:
    case 14:
    case 15: document.write("i am less than or equal to 15");break;
    

    【讨论】:

      【解决方案2】:

      假设您想打开数字 10-14 (10,11,12,13,14),您可以将这些案例链接在一起:

      switch(number) {
        case 10: 
        case 11: 
        case 12:
        case 13:
        case 14:
          alert("I'm between 10 and 14");
          break;
        default:
          alert("I'm not between 10 and 14");
          break;
      }
      

      【讨论】:

        【解决方案3】:

        您可以简单地省略break; 语句。

        switch (2) {
            case 1: case 2: case 3:
                console.log('1 or 2 or 3');
                break;
            default:
                console.log('others');
                break;
        }
        

        我想尝试一下这个概念,我不推荐这种方法,但是你也可以依赖一个函数来为你创建一个控制流函数。这只是允许一些语法糖。

        var createCaseFlow = (function () {
            var rangeRx = /^(\d)-(\d)$/;
        
            function buildCases(item) {
                var match = item.match(rangeRx),
                    n1, n2, cases;
        
                if (match) {
                    n1 = parseInt(match[1], 10);
                    n2 = parseInt(match[2], 10);
                    cases = [];
        
                    for (; n1 <= n2; n1++) {
                        cases.push("case '" + n1 + "':");
                    }
        
                    return cases.join('');
                }
        
                return "case '" + item + "':";
            }
        
            return function (cases, defaultFn) {
                var fnStrings = ['switch (value.toString()) { '],
                    k;
        
                for (k in cases) {
                    if (cases.hasOwnProperty(k)) {
                        fnStrings.push(k.split(',').map(buildCases).join('') + "return this[0]['" + k + "'](); break;");
                    }
                }
        
                defaultFn && fnStrings.push('default: return this[1](); break;');
        
                return new Function('value', fnStrings.join('') + '}').bind(arguments);
            };
        
        })();
        
        var executeFlow = createCaseFlow({
                '2-9': function () {
                    return '2 to 9';
                },
                '10,21,24': function () {
                    return '10,21,24';
                }
            },
            function () {
                return 'default case';
            }
        );
        
        console.log(executeFlow(5)); //2 to 9
        console.log(executeFlow(10)); //10,21,24
        console.log(executeFlow(13)); //default case
        

        【讨论】:

          【解决方案4】:

          看看这个答案Switch on ranges of integers in JavaScript

          总之你可以做到这一点

          var x = this.dealer;
          switch (true) {
              case (x < 5):
                  alert("less than five");
                  break;
              case (x > 4 && x < 9):
                  alert("between 5 and 8");
                  break;
              case (x > 8 && x < 12):
                  alert("between 9 and 11");
                  break;
              default:
                  alert("none");
                  break;
          }
          

          但这有点违背了 switch 语句的目的,因为你可以只链接 if-else 语句。或者你可以这样做:

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

          【讨论】:

          • 是的,我没有看到switch (true) 比一系列 if-else 语句的优势。
          • 看看我的回答,你可能会觉得很有趣。
          【解决方案5】:

          您已经获得了一些关于如何完成这项工作的答案。但是,我想指出更多的事情。首先,就个人而言,我不会为此使用 switch/case 语句,因为有很多类似的情况——经典的 if/elseif/else 链在这里感觉更合适。

          根据用例,您还可以提取一个函数,然后使用您的开关/案例(当然,使用更有意义的名称和值):

          function getCategory (number) {
              if(number > 20) {
                  return 3;
              }
              if(number > 15) {
                  return 2;
              }
              if(number > 8) {
                  return 1;
              }
          
              return 0;
          } 
          
          switch( getCategory( someNumber ) ) {
              case 0:
                  // someNumber is less than or equal to 8
                  break;
              case 1:
                  // someNumber is any of 9, 10, 11, 12, 13, 14, 15
                  break;
              // ...
          }
          

          如果间隔是等距的,你也可以这样做:

          switch( Math.floor( someNumber / 5 ) ) {
              case 0:
                  // someNumber is any one of 0, 1, 2, 3, 4
                  break;
              case 1:
                  // someNumber is any one of 5, 6, 7, 8, 9
                  break;
              // ...
          }
          

          此外,应该注意的是,有些人认为 switch/case 语句带有失败(= 在某些情况下省略 break; 语句)是不好的做法,尽管其他人认为这完全没问题。

          【讨论】:

          • 我总是喜欢玩,但我永远不会在生产代码中使用它。不过,这是一个不错的小提琴。
          • 嗯,它可能对性能有害,但除此之外,我不确定这不是一个可行的解决方案,尤其是在良好的测试覆盖率的情况下。
          • 我不太喜欢使用字符串值进行数字比较的想法,我想坚持使用相同的类型。它肯定会破坏任何 IDE 识别正在发生的事情的功能。我只是看不到 if/elseif/else 的好处,或者,如果用例允许,类别类型的处理,这让我觉得“是的,就是这样!”
          • 除非switchif else if 快得多,但事实并非如此(至少在所有浏览器中),我同意没有任何优势,也许只是可读性略高。
          最近更新 更多