【问题标题】:Why are repeated case labels in a switch block allowed in JavaScript?为什么 JavaScript 允许在 switch 块中重复大小写标签?
【发布时间】:2015-03-03 10:32:18
【问题描述】:

我在正在调试的文件中发现了一个令人讨厌的复制粘贴错误。这是switch 语句中的重复大小写标签。

switch (value) {

    case 1:
    case 2:
        doSomething();
        break;

    case 2:
        doSomethingElse();
        break;

    default:
        break;

}

事实证明,这是完全合法的 JavaScript。甚至标准的代码质量工具也不会在这里抱怨:JSHint 和 JSCS 可以处理重复的标签、缺少的 break 语句和第二种情况 2 之后的死代码。

据我所知,重复的大小写值在 C++ 和 Java 中是非法的。

在 JavaScript 的 switch 块中有多个相同的 case 标签是有目的的吗?为什么允许这样做?

【问题讨论】:

  • 永远不会遇到第二种情况。它实际上是死代码。我猜他们只是不寻找那个,因为他们希望程序员不要做这么愚蠢的事情
  • 嗯,这个问题就像“为什么 JS 是这样设计的?”。我不确定您希望听到什么样的答案。
  • 是的,这是一个关于语言设计的问题,因此是主观的。 ) 并且有一些具有失败行为的用例 (here's one)。
  • @raina77ow:AFAICT,该示例中的第二个 case 0: 完全没有目的,可以删除。
  • WebStorm(或其他 JetBrains 编辑器)在有重复案例标签时会显示警告。

标签: javascript switch-statement


【解决方案1】:

当然,基本的答案是,因为规范并没有说它是无效的。但这只是引出了为什么规范没有说它是无效的问题。

除非引用 Brendan Eich 在某处解决这一特定问题(我没有看到他这样做,但也许他已经这样做了),我们不能肯定地说,我们只能尝试考虑 可能 原因。

我能想到两个:

  1. JavaScript 的 switch 语句与 C++ 或 Java 的完全不同:cases 的值是在运行时评估的表达式switch,在 JavaScript 中,实际上只是 if/else if/else 的语法糖(cases 是按源代码顺序考虑的,没有跳转表或类似的优化步骤)。考虑一下这个有效的 JavaScript:

    var a = "foo";
    var b = "bar";
    var c = Math.random() < 0.5 ? "FOO" : "BAR";
    
    switch (c) {
      case a.toUpperCase():
        console.log("It was " + a + " in upper case");
        break;
      case b.toUpperCase():
        console.log("It was " + b + " in upper case");
        break;
    }
    

    你不能在 C++ 或 Java 中做到这一点。

    由于它们是在运行时评估的表达式,因此您无法在一般情况下提前知道它们是重复的(尽管在您的具体示例中当然可以,因为值是常量)。

  2. JavaScript 传统上没有编译步骤,并且传统上对编码奇怪的东西很友好。一般来说,JavaScript 的方向是引擎应该尽最大努力运行它们所提供的东西,而不是失败。这就是为什么在同一范围内使用var a; 两次不是错误,在同一范围内通过函数声明声明两个函数不是错误(第二个声明获胜)等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2011-05-10
    • 2018-08-15
    相关资源
    最近更新 更多