我最近遇到过这样的代码,其中switch语句似乎与switch中的答案(boolean)和case中的表达式相反。代码运行正常,但我担心跨浏览器。这是有效的JavaScript吗?
switch(true) {
case (y < 20):
//
break;
case (y < 60):
//
break;
case (y < 130):
//
break;
}
答案 0 :(得分:12)
这个片段非常好。这只是另一种表达方式:
if (y < 20) {
// ...
} else if (y < 60) {
// ...
} else if ( y < 130) {
// ...
}
答案 1 :(得分:7)
是的,这是有效的。
与许多“现代”语言一样,Javascript中的switch
与C语言中原始的基于int的switch
相距甚远,它只保留了一般语义。
在ECMAScript中规范化的switch子句在此详细解释:http://www.ecma-international.org/ecma-262/5.1/#sec-12.11
基本上,执行第一种情况,其值等于switch(Expression)
中的表达式。
明显的if else if
序列的主要优点是能够省略break
语句并执行多个块。请注意,与旧的C开关相反,没有真正的性能改进,在这种情况下,它既不简洁也不易读。
答案 2 :(得分:7)
SwitchStatement : switch ( Expression ) CaseBlock CaseBlock : { CaseClauses(opt) } { CaseClauses(opt) DefaultClause CaseClauses(opt) } CaseClauses : CaseClause CaseClauses CaseClause CaseClause : case Expression : StatementList(opt) DefaultClause : default : StatementList(opt)
否则表示switch表达式或case表达式必须是数字,字符串,布尔值或其他任何内容。 true
完全可以接受为switch表达式,y < 20
完全可以接受为case表达式。请记住,切换表达式和案例表达式之间的比较是使用===
运算符进行的。
在您发布的代码中,第一个true
案例将被执行,直到遇到break
或交换机块结束。
答案 3 :(得分:2)
y
。因为条件取决于y
的值。如aefxx所述,它是另一种形式:
if (y < 20) {
// ...
} elseif (y < 60) {
// ...
} elseif ( y < 130) {
// ...
}
答案 4 :(得分:2)
这是有效的。
代码
switch(f0()) {
case f1(): ..;
case f2(): ..;
default: dflt;
}
其中fX()
表示任意表达式(函数调用用于显示强制评估)可以大致重写为
for (;;) { // for "break"
var _x = f0()
if (_x === f1()) { .. }
if (_x === f2()) { .. }
dflt;
break;
}
即 case
中的表达式评估,然后与switch
中的表达式进行比较。 (这与C或Java等语言的明显分歧,需要case
表达式中的常量值。)
当然,break
将“退出交换机” - 而不是标准的直通语义 - 因此,true
是提供给switch
的表达式,发布的示例在语义上等同于if/else if
,如aefxx所示。