23

我最近遇到了一个代码,其中一个 switch 语句似乎与 switch 中的答案(布尔值)和 case 中的表达式相反。代码按预期运行良好,但我担心跨浏览器。它是有效的javascript吗?

switch(true) {
  case (y < 20):
    //
    break;
  case (y < 60):
    //
    break;
  case (y < 130):
    //
    break;
}
4

5 回答 5

12

这个片段非常好。这只是另一种表达方式:

if (y < 20) {
    // ...
} else if (y < 60) {
    // ...
} else if ( y < 130) {
    // ...
}
于 2013-01-02T08:37:40.103 回答
7

是的,它是有效的。

与许多“现代”语言一样,switchJavascript 中的 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 开关相反,没有真正的性能改进,在这种情况下,它既不简洁也不可读。

于 2013-01-02T08:38:11.650 回答
7

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 块结束。

于 2013-01-02T09:13:30.907 回答
2

案例将根据 的值执行y

因为条件取决于 的值y。正如aefxx 所说,它是另一种形式:

if (y < 20) {
    // ...
} elseif (y < 60) {
    // ...
} elseif ( y < 130) {
    // ...
}
于 2013-01-02T08:39:09.000 回答
2

这是有效的。

编码

switch(f0()) {
    case f1(): ..; 
    case f2(): ..;
    default: dflt;
}

其中fX()表示任意表达式(函数调用用于显示强制评估)可以近似地重写为

for (;;) { // for "break"
    var _x = f0()
    if (_x === f1()) { .. }
    if (_x === f2()) { .. }
    dflt;
    break;
}

也就是说,计算中的表达式,然后与 中的表达式进行比较caseswitch。(这与 C 或 Java 等需要表达式中的常量值的语言case截然不同。)

当然,break将“退出开关”——与标准的贯穿语义相反——因此,true提供给 的表达式在哪里switch,发布的示例在语义上等同于if/else ifaefxx 所示的 。

于 2013-01-02T09:04:16.343 回答