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

Pri*_*ens 20 javascript boolean switch-statement

我最近遇到的代码中,switch语句似乎与交换机中的答案(布尔值)和案例中的表达式相反.代码运行正常,但我担心跨浏览器.这是有效的JavaScript吗?

switch(true) {
  case (y < 20):
    //
    break;
  case (y < 60):
    //
    break;
  case (y < 130):
    //
    break;
}
Run Code Online (Sandbox Code Playgroud)

aef*_*fxx 12

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

if (y < 20) {
    // ...
} else if (y < 60) {
    // ...
} else if ( y < 130) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我会用"if(true ==(y <20))"等表示等价,以显示*真正*正在做什么.例如,如果它是`switch(false)`它将等同于`if(false ==(y <20))`并产生不同的结果. (5认同)

Den*_*ret 7

是的,它是有效的.

与许多"现代"语言一样,switchJavascript switch与C语言的原始int相差甚远,它只保留了一般语义.

在ECMAScript中规范化的switch子句在此详细解释:http://www.ecma-international.org/ecma-262/5.1/#sec-12.11

基本上,执行其值等于表达式的第一种情况switch(Expression).

明显if else if序列的主要优点是能够省略break语句并执行多个块.请注意,与旧的C开关相反,没有真正的性能改进,在这种情况下,它既不简洁也不易读.


Sal*_*n A 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)
Run Code Online (Sandbox Code Playgroud)

不,它表示switch表达式或case表达式必须是数字,字符串,布尔值或任何东西.true作为switch表达式y < 20是完全可以接受的,并且作为case表达式是完全可以接受 请记住,switch表达式和case表达式之间的比较是使用===operator进行的.

在您发布的代码中,第一种true情况将被执行,直到break遇到或开关块结束.