是开关(true){...有效的javascript?

时间:2013-01-02 08:35:21

标签: javascript boolean switch-statement

我最近遇到过这样的代码,其中switch语句似乎与switch中的答案(boolean)和case中的表达式相反。代码运行正常,但我担心跨浏览器。这是有效的JavaScript吗?

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

5 个答案:

答案 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)

syntax of switch statement是:

  
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所示。