这不需要 switch 语句。使用 if else 语句更清晰、更简洁、更快、优化更好……
var d = this.dealer;
if (1 <= d && d <= 11) { // making sure in range 1..11
if (d <= 4) {
alert("1 to 4");
} else if (d <= 8) {
alert("5 to 8");
} else {
alert("9 to 11");
}
} else {
alert("not in range");
}
速度测试
我很好奇使用 switch 而不是更简单的 if...else... 的开销,所以我把一个 jsFiddle 放在一起来检查它...
http://jsfiddle.net/17x9w1eL/
Chrome:switch比if else慢 70% 左右
Firefox:switch比if else慢 5% 左右
IE: switch比if else慢 5% 左右
Safari: switch比if else慢了大约 95%
笔记:
分配给局部变量是可选的,尤其是当您的代码稍后要自动优化时。
对于数字范围,我喜欢使用这种结构......
if (1 <= d && d <= 11) {...}
...因为对我来说它更接近于你在数学中表达范围的方式 (1 <= d <= 11),当我阅读代码时,我可以将其读作“如果 d 介于 1 和11"。
更清晰
一些人认为这不是更清楚。我想说它并不太清楚,因为结构与 switch 选项几乎相同。它更清晰的主要原因是它的每个部分都是可读的并且具有简单的直观意义。
我对“switch (true)”的担忧是,它可能看起来是一行毫无意义的代码。许多编码员,阅读这些内容时不知道该怎么做。
对于我自己的代码,我更愿意不时使用晦涩的结构,但如果其他人会看它,我会尝试使用更清晰的结构。我认为最好将这些结构用于它们的目的。
优化
在现代环境中,代码通常会被缩小以用于生产,因此您可以编写清晰简洁的代码,具有可读的变量名称和有用的注释。没有明确的理由以这种方式使用 switch。
我还尝试将这两种构造都通过一个压缩器。if/else 结构压缩得很好,成为使用嵌套三元运算符的单个短表达式。缩小后的 switch 语句仍然是一个 switch,带有“switch”、“case”和“break”标记,因此代码要长得多。
switch(true) 如何工作
我认为“switch(true) 很模糊,但似乎有些人只是想使用它,所以这里解释一下它为什么起作用......
switch/case 语句的工作原理是将 switch 中的部分与每个 case 进行匹配,然后在第一个匹配项上执行代码。在大多数用例中,我们在 switch 中有一个变量或非常量表达式,然后匹配它。
用“switch(true)”,我们会找到case语句中第一个为真的表达式。如果把“switch(true)”读成“找到第一个为真的表达式”,代码感觉更可读。