【问题标题】:Switch case - else condition切换案例 - 其他条件
【发布时间】:2011-12-23 12:36:12
【问题描述】:
<script type="text/javascript">
//You will receive a different greeting based
//on what day it is. Note that Sunday=0,
//Monday=1, Tuesday=2, etc.

var d = new Date();
var theDay = d.getDay();
switch (theDay)
{
case 5:
  document.write("Finally Friday");
  break;
case 6:
  document.write("Super Saturday");
  break;
case 0:
  document.write("Sleepy Sunday");
  break;
default:
  document.write("I'm looking forward to this weekend!");
}
</script>

如果theDay = 5,那么我们显示Finally Friday。我想要如果 theDay !=5,然后显示 'Finally Something' .. 对其他人也是如此......

没有 If/else 条件是否可能。 如果案例5没有执行,我可以在那个地方做点别的吗?

【问题讨论】:

  • 您的意思是要更改或添加到default 案例中的文本?
  • @FelixKling:我想如果 5 没有执行,那么应该会发生其他事情...... 6 或 0 可能会执行......
  • 使用普通的 if...else 有什么问题?

标签: javascript


【解决方案1】:

是否有可能没有 If/else 条件。如果案例5没有执行,我可以在那个地方做点别的吗?

没有。

switch 语句将执行第一个匹配的 case,然后继续(忽略所有进一步的 case 标签)直到它到达 break 语句或 switch 块的末尾——但即使你可以“失败”到随后的情况下,通过省略 break 语句,switch 不提供任何机制来表示“当这种情况不匹配/执行时做某事,但也继续尝试寻找匹配的情况”。

您所描述的通常是通过一系列 if/else 语句来完成的:

var d = new Date(),
    theDay=d.getDay(),
    matched = false;

if (theDay === 5) {
  matched = true;
  document.write("Finally Friday");
} else {
  // your != 5 case here
}
if (theDay === 6) {
  matched = true;
  document.write("Super Saturday");
} else {
  // your != 6 case here
}
if (theDay === 0) {
  matched = true;
  document.write("Sleepy Sunday");
} else {
  // your != 0 case here
}

// default when none matched:
if (!matched) {
  document.write("I'm looking forward to this weekend!");
}

请注意,我添加了一个 matched 标志以允许默认设置工作。请注意,没有 else if 语句,因为您需要执行每个 if/else 对。

如果您真的下定决心要使用 switch 语句,您可以愚蠢地执行以下操作:

var d = new Date(),
    theDay = d.getDay(),
    c,
    cases = { // pre-list all the "not" cases
             "!5" : true,
             "!6" : true,
             "!0" : true
            };

// add case for theDay and remove the "not" case for theDay (if there is one)
cases[theDay] = true;
if (cases["!" + theDay])
   delete cases["!" + theDay];

for (c in cases) {
   switch(c) {  
      case "5":
         document.write("Finally Friday");
         break;
      case "!5":
         document.write("Finally Something");
         break;
      case "6":
         document.write("Super Saturday");
         break;
      case "!6":
         document.write("Finally Something - but not 6");
         break;
      case "0":
         document.write("Sleepy Sunday");
         break;
      case "!0":
         document.write("Finally Something - but not 0");
         break;
      default:
         document.write("I'm looking forward to this weekend!");
   }
}

如果您需要以特定顺序执行案例,请使用数组而不是对象。

【讨论】:

    【解决方案2】:

    它的like switch 会跳转到匹配的case,如果不匹配则会跳转到匹配的case。您的问题的答案“如果案例 5 没有执行,我可以在那个地方做其他事情吗?”是不,因为它根本没有达到那种情况。它跳转到下一个匹配的大小写或默认值。

    【讨论】:

      【解决方案3】:

      标准的if/else 将是实现这一目标的最佳方式。我想知道你为什么不这样做。

      也就是说,它不是很优雅,但您可以尝试在 switch 语句的顶部添加以下内容:

      case 0:
      case 1:
      case 2:
      case 3:
      case 4:
      case 6:
         document.write("Finally Something");
      

      给你:

      switch (theDay)
      {
      case 0:
      case 1:
      case 2:
      case 3:
      case 4:
      case 6:
         document.write("Finally Something");
      case 5:
        document.write("Finally Friday");
        break;
      case 6:
        document.write("Super Saturday");
        break;
      case 0:
        document.write("Sleepy Sunday");
        break;
      default:
        document.write("I'm looking forward to this weekend!");
      }
      

      【讨论】:

      • 那行不通。如果值为 6,它将只执行第一个匹配的案例以及任何失败。它永远不会做第二种情况 6。
      【解决方案4】:

      你可以这样做:

      var something = 0;
      
      switch (theDay) {
          case 5:
            document.write("Finally Friday");
            something = 15;
            break;
          case 6:
            document.write("Super Saturday");
            something = 16;
            break;
          case 0:
            document.write("Sleepy Sunday");
            something = 20;
            break;
          default:
            document.write("I'm looking forward to this weekend!");
      }
      
      
      switch (something) {
          case 15: document.write("Not Friday");   break;
          case 16: document.write("Not Saturday"); break;
          case 20: document.write("Not Sunday");   break;
          default: document.write("Nothing");      break;
      }
      

      【讨论】:

      • 类似的东西可能会起作用,但请注意,如果 theDay === 5 编写,您的代码将编写“Finally Friday”,然后是“Not Friday”(其他日子依此类推)。
      【解决方案5】:

      是否有可能没有 If/else 条件。如果案例5没有执行,我可以在那个地方做点别的吗?

      使用如下所示的默认代码块。任何与案例不匹配的内容都将回退到默认案例。

      switch(expression) {
            case x:
              // code block
              break;
            case y:
              // code block
              break;
            default:
              // code block
          }
      

      这是如何工作的:

      • 将表达式的值与每个案例的值进行比较。
      • 如果匹配,则执行关联的代码块。
      • 如果不匹配,则执行默认代码块。

      【讨论】:

        【解决方案6】:

        过于复杂的答案。

        简化。

        var switchElse = true;
        switch (CHECK_SOMETHING) 
        {
            case "SOME_VALUE":
                ...DO SOMETHING...
                switchElse = false;
                break;
            default:
        }
        
        if (switchElse) 
        {
                ...DO ELSE...
        }
        

        唯一无需比较即可制定的解决方案。 使用“默认”模式

        var myValue = "Friday"
        switch (CHECK_SOMETHING)
        {
            case "SOME_VALUE": 
                 myValue = "Some Other Day";
            default:
        }
        

        【讨论】:

        • 与其他相比,它更简单吗?什么是默认模式?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 2022-07-21
        • 2021-03-23
        • 2015-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多