【问题标题】:What is the purpose of boolean switch statements in JavaScript?JavaScript 中布尔 switch 语句的目的是什么?
【发布时间】:2010-12-16 13:36:21
【问题描述】:

我刚刚在别人的 JavaScript 代码中遇到了一个布尔型 switch 语句。看起来有点像这样:

switch (a || b) {
  case true:
    // do some stuff
  break;
  default:
    // do other stuff
  break;
}

我编程的时间不长,但我肯定从未见过这样的事情。这似乎有点愚蠢,但我想给程序员带来怀疑的好处。上面的代码和下面的代码有什么功能上的区别:

if (a || b) {
  // do some stuff
}
else {
  // do other stuff
}

如果有,那是什么?

【问题讨论】:

    标签: javascript coding-style if-statement switch-statement


    【解决方案1】:

    是的,有区别。考虑到你的例子,

    var a = 0,
        b = 1;
    

    现在让我们看一下switch 声明:

    switch (a || b) {
    

    当这个 switch 语句运行时,表达式 a || b 被计算。 || 是一个短路运算符,如果它是“真实的”,它将返回左操作数的值,否则它将返回右操作数的值。在这种情况下,a = 0,因此将返回 b (1)。现在看看case 声明:

    case true:
    

    在评估case 语句时,不会对任一值执行类型强制,并假定严格相等。在我们的示例中,这与编写1 === true 相同,因此case 语句后面的代码永远不会运行。那么我们来看看if的声明:

    if (a || b) {
    

    对于if 语句,条件表达式a || b 被求值然后将结果转换为布尔值。在内部,这看起来像ToBoolean(a || b)。由于 a || b 的计算结果为 1 并且将 1 强制转换为布尔值是 true,因此条件通过并且块执行。

    更好的等价物是:

    if ((a || b) === true) {
        // do some stuff
    }
    else {
        // do other stuff
    }
    

    正如已经指出的,在有很多情况和类型可能不同的情况下,switch 语句可能很有用。但是,这种情况很少见。

    【讨论】:

    • @thismax: np,很高兴我能帮上忙 :-)
    【解决方案2】:

    需要明确的是,这种情况看起来很滥用,但由于原则上 Javascript 不是强类型的,因此在您无法控制输入的情况下它可能很有价值:

    switch (foo)
    {
        case true:
            // whatever
            break;
        case false:
            // whatever
            break;
        default:
            // FOO IS NOT A BOOLEAN, DO SOMETHING ELSE!
            break;
    }
    

    以及安德鲁的混合情况。这比简单的 if/else 更安全,也比某种布尔检查和 if/else 更简洁。

    【讨论】:

    • 之所以有效,是因为 Andy E 更雄辩地阐明了这种情况,因此对案件缺乏强制力。
    【解决方案3】:

    在安迪的评论和回答后更新 没有区别(在您的示例中),但在您的示例中,if 块更具可读性并且在这种情况下更有意义(在我看来)。

    switching 在评估为 boolean 的语句上似乎是错误的,因为总是只有两种情况(truefalse),因此我推荐if 阻止。

    switch 在评估可能具有多个值的变量时更有意义:

    switch(fruitType) {
        case 'Apple':
        // Apple Code
        break;
        case 'Orange':
        // Orange Code
        break;
        // etc...
        default: // other fruit
        break;
    }
    

    希望有帮助!

    【讨论】:

    • 有区别。 || 是一个短路运算符,它不一定会返回一个布尔值。例如0 || 1 将返回1,并且case 语句严格相等。
    【解决方案4】:

    在您的示例中,没有区别。但根据 ab 的定义方式,您可以稍后添加更多 switch 语句,f.ex:

    var a = false, b = null;
    switch (a || b) {
      case true:
        // do some stuff
      break;
      case null:
        // do some stuff
      break;
      default:
        // do other stuff
      break;
    }
    

    除此之外,这主要是编码偏好的问题。

    【讨论】:

      【解决方案5】:

      您的示例没有显示它,但我认为如果您想在第一个 case 中使用失败(即不中断),这可能会使代码更简洁,具体取决于具体情况。

      如果您以一种可以预见潜在变化的方式实现某些东西并希望尽量减少返工(例如,希望在仅重做选择逻辑的同时保持操作相同),那么它也可能是一个不错的结构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-09
        • 1970-01-01
        • 2013-09-24
        • 2014-08-18
        • 2018-04-28
        • 2011-04-17
        • 1970-01-01
        • 2013-05-30
        相关资源
        最近更新 更多