5.7 switch
现在来简单介绍一下 switch ,可以把它看作 if..else if..else.. 的简化版本:
switch (a) { case 2: // 执行一些代码 break; case 42: // 执行另外一些代码 break; default: // 执行缺省代码 }
这里 a 与 case 表达式逐一进行比较。如果匹配就执行该 case 中的代码,直到 break 或者 switch 代码块结束。
这看似并无特别之处,但其中存在一些不太为人所知的陷阱。
首先,a 和 case 表达式的匹配算法与 === (参见第 4 章)相同。通常 case 语句中的 switch 都是简单值,所以这并没有问题。
然而,有时可能会需要通过强制类型转换来进行相等比较(即 == ,参见第 4 章),这时就需要做一些特殊处理:
var a = "42"; switch (true) { case a == 10: console.log( "10 or '10'" ); break; case a == 42; console.log( "42 or '42'" ); break; default: // 永远执行不到这里 } // 42 or '42'
除简单值以外,case 中还可以出现各种表达式,它会将表达式的结果值和 true 进行比较。因为 a == 42 的结果为 true ,所以条件成立。
尽管可以使用 == ,但 switch 中 true 和 true 之间仍然是严格相等比较。即如果 case 表达式的结果为真值,但不是严格意义上的 true (参见第 4 章),则条件不成立。所以,在这里使用 || 和 && 等逻辑运算符就很容易掉进坑里:
var a = "hello world"; var b = 10; switch (true) { case (a || b == 10): // 永远执行不到这里 break; default: console.log( "Oops" ); } // Oops
因为 (a || b == 10) 的结果是 "hello world" 而非 true ,所以严格相等比较不成立。此时可以通过强制表达式返回 true 或 false ,如 case !!(a || b == 10): (参见第 4 章)。
最后,default 是可选的,并非必不可少(虽然惯例如此)。break 相关规则对 default 仍然适用:
var a = 10; switch (a) { case 1: case 2: // 永远执行不到这里 default: console.log( "default" ); case 3: console.log( "3" ); break; case 4: console.log( "4" ); } // default // 3
正如之前介绍的,case 中的 break 也可以带标签。
上例中的代码是这样执行的,首先遍历并找到所有匹配的 case ,如果没有匹配则执行 default 中的代码。因为其中没有 break ,所以继续执行已经遍历过的 case 3 代码块,直到 break 为止。
理论上来说,这种情况在 JavaScript 中是可能出现的,但在实际情况中,开发人员一般不会这样来编码。如果确实需要这样做,就应该仔细斟酌并做好注释。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论