JavaScript中boolean switch语句的用途是什么?

时间:2010-12-16 13:36:22

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

我刚刚在别人的JavaScript代码中遇到了一个boolean 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
}

如果有,那是什么?

5 个答案:

答案 0 :(得分:8)

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

var a = 0,
    b = 1;

现在让我们看看switch声明:

switch (a || b) {

运行此switch语句时,将计算表达式a || b||是一个短路运算符,如果它是“truthy”,它将返回左操作数的值,否则它将返回右操作数的值。在这种情况下,a = 0,将返回b1)。现在看一下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语句可能会有用。然而,这种情况很少见。

答案 1 :(得分: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。

答案 2 :(得分:1)

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

switch评估为boolean的语句似乎是错误的,因为总会有两种情况(truefalse),以及因此我建议使用if块。

当你评估一个可能有很多值的变量时,

switch更有意义:

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

希望有所帮助!

答案 3 :(得分:0)

在您的示例中,没有区别。但是,根据ab的定义方式,您可以稍后添加更多切换语句,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;
}

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

答案 4 :(得分:0)

你的例子没有显示它,但我认为如果你想在第一个case中使用一个穿透(即没有中断),这可能会产生更简洁的代码,具体取决于具体情况。 / p>

如果您以预期潜在变化的方式实现某些内容并希望获得最少的返工(例如,希望在重做选择逻辑时保持相同的操作),它也可能是一个不错的构造。