我最近遇到了一个代码,其中一个 switch 语句似乎与 switch 中的答案(布尔值)和 case 中的表达式相反。代码按预期运行良好,但我担心跨浏览器。它是有效的javascript吗?
switch(true) {
case (y < 20):
//
break;
case (y < 60):
//
break;
case (y < 130):
//
break;
}
我最近遇到了一个代码,其中一个 switch 语句似乎与 switch 中的答案(布尔值)和 case 中的表达式相反。代码按预期运行良好,但我担心跨浏览器。它是有效的javascript吗?
switch(true) {
case (y < 20):
//
break;
case (y < 60):
//
break;
case (y < 130):
//
break;
}
这个片段非常好。这只是另一种表达方式:
if (y < 20) {
// ...
} else if (y < 60) {
// ...
} else if ( y < 130) {
// ...
}
是的,它是有效的。
与许多“现代”语言一样,switch
Javascript 中的 int 与 C 语言中基于 int 的原始语言相去甚远switch
,它只保留了一般语义。
在 ECMAScript 中规范化的 switch 子句在此处详细解释:http: //www.ecma-international.org/ecma-262/5.1/#sec-12.11
基本上,执行值等于表达式 in 的第一个 case switch(Expression)
。
与明显顺序相比的主要优点if else if
是能够省略break
语句并执行多个块。请注意,与旧的 C 开关相反,没有真正的性能改进,在这种情况下,它既不简洁也不可读。
switch 语句的语法是:
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 表达式是完全可以接受的。请记住,switch 表达式和 case 表达式之间的比较是使用===
运算符进行的。
在您发布的代码中,true
将执行第一个案例,直到break
遇到或 switch 块结束。
y
。因为条件取决于 的值y
。正如aefxx 所说,它是另一种形式:
if (y < 20) {
// ...
} elseif (y < 60) {
// ...
} elseif ( y < 130) {
// ...
}
这是有效的。
编码
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 所示的 。