【问题标题】:Using break after default in switch statement when default not at end当默认值不在结尾时,在 switch 语句中使用默认值后中断
【发布时间】:2019-05-10 21:02:51
【问题描述】:

在 w3schools tutorial 的 switch 语句中,它说:

如果 default 不是 switch 块中的最后一个 case,记得结束 默认情况下有一个break。

但是,正如该教程还指出的那样:

当 JavaScript 到达一个 break 关键字时,它会跳出 switch 块。

因此,如果您在 switch 语句的开头有一个带 break 的默认值,为什么不总是执行默认值并且解释器立即退出该块?解释器没有按顺序读取switch语句中的项目?

【问题讨论】:

  • 因为default: 仅在其他情况都不匹配时才使用。

标签: javascript switch-statement


【解决方案1】:

如教程所述

default 关键字指定在没有 case 匹配时要运行的代码

default关键字的位置无关紧要,后面的case会在执行defaultcase中的代码之前进行测试。如果其中一种情况匹配,则将执行其代码,因此不会执行 default 块中的 break

default 之后的代码仅在没有任何显式情况匹配时执行,或者选择了default 之前的情况并且default 之前没有break(因此它失败了)。

default: 的情况通常按惯例写在最后,因此那里通常不需要break。教程中的警告只是提醒您,如果您之前输入了default:,则在没有break 时继续进入下一个案例的规则仍然适用; default 规则并没有什么特别之处可以阻止它。

【讨论】:

    【解决方案2】:

    这是在 ECMA-262, 13.12.9 Runtime Semantics: CaseBlockEvaluation 中指定的(这是 JavaScript 的定义)。

    不幸的是,该规范有点难以阅读,但归结为以下几点:要执行 switch 语句,请尝试 default 之前的 case 子句,如果有的话;然后尝试default 之后的case 子句,如果有的话;只有当它们都不匹配时,才执行default 部分。 default 的位置无关紧要。

    【讨论】:

      【解决方案3】:

      tutorial你也可以阅读:

      default 关键字指定在 NO CASE 匹配时要运行的代码。

      例如,如果在开头定义,并且有case匹配,则与该匹配关联的代码将被执行,而不是与默认块关联的代码,例如:

      function test(n)
      {
          let res;
      
          switch (n)
          {
              default: 
                  res = "default";
                  break;
              case 1:
                  res = "Case 1";
                  break; 
              case 0:
                  res = "Case 2";
           }
      
           return res;
      }
      
      console.log(test(1), test(0), test(9));
      .as-console {background-color:black !important; color:lime;}
      .as-console-wrapper {max-height:100% !important; top:0;}

      如您所见,default 块仅在没有匹配项时执行(如在test(9) 上)。现在,关于这个:

      如果 default 不是 switch 块中的最后一个案例,请记住以 break 结束 default 案例。

      您可以阅读下一个警告:

      注意:如果省略break 语句,即使评估与case 不匹配也会执行下一个 case。

      因此,例如,如果我们在上一个示例中省略 break 语句,我们将不会得到预期的默认情况下的 default 字符串,而是会得到字符串 Case 1

      function test(n)
      {
          let res;
      
          switch (n)
          {
              default: 
                  res = "default";
              case 1:
                  res = "Case 1";
                  break; 
              case 0:
                  res = "Case 2";
           }
      
           return res;
      }
      
      console.log(test(1), test(0), test(9), test(99));
      .as-console {background-color:black !important; color:lime;}
      .as-console-wrapper {max-height:100% !important; top:0;}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 2013-04-08
        • 1970-01-01
        相关资源
        最近更新 更多