我刚刚在别人的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
}
如果有,那是什么?
答案 0 :(得分:8)
是的,有区别。考虑你的例子,
var a = 0,
b = 1;
现在让我们看看switch
声明:
switch (a || b) {
运行此switch语句时,将计算表达式a || b
。 ||
是一个短路运算符,如果它是“truthy”,它将返回左操作数的值,否则它将返回右操作数的值。在这种情况下,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
语句可能会有用。然而,这种情况很少见。
答案 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
的语句似乎是错误的,因为总会有两种情况(true
和false
),以及因此我建议使用if
块。
switch
更有意义:
switch(fruitType) {
case 'Apple':
// Apple Code
break;
case 'Orange':
// Orange Code
break;
// etc...
default: // other fruit
break;
}
希望有所帮助!
答案 3 :(得分:0)
在您的示例中,没有区别。但是,根据a
和b
的定义方式,您可以稍后添加更多切换语句,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>
如果您以预期潜在变化的方式实现某些内容并希望获得最少的返工(例如,希望在重做选择逻辑时保持相同的操作),它也可能是一个不错的构造。