在JavaScript中打开整数范围
我想要做这样的事情
switch (this.dealer) { case 1-4: // Do something. break; case 5-8: // Do something. break; case 9-11: // Do something. break; default: break; }
什么是正确的语法呢? 在JavaScript中可能吗?
所以this.dealer
是一个整数,如果它在这些值之间,做些事情。
这是我想出来的另一种方法:
var x = this.dealer; switch (true) { case (x < 5): alert("less than five"); break; case (x > 4 && x < 9): alert("between 5 and 8"); break; case (x > 8 && x < 12): alert("between 9 and 11"); break; default: alert("none"); break; }
MarvinLabs的答案越来越清晰:
var x = this.dealer; switch (true) { case (x < 5): alert("less than five"); break; case (x < 9): alert("between 5 and 8"); break; case (x < 12): alert("between 9 and 11"); break; default: alert("none"); break; }
没有必要检查范围的下限,因为break
语句会导致执行跳过剩余的情况,所以在执行检查例如(x <9)时,我们知道该值必须是5或更大。
当然,如果案例保持原来的顺序,输出是正确的,我们假设整数值(如问题中所述) – 从技术上讲,范围在5到8.999999999999之间,因为js中的所有数字实际上是双精度浮点点数。
如果您希望能够移动案例,或者在每个案例中都能看到整个范围的可读性,那么只需在每个案例的较低范围内添加一个小于或等于的检查:
var x = this.dealer; switch (true) { case (x < 5): alert("less than five"); break; case (x >= 5 && x < 9): alert("between 5 and 8"); break; case (x >= 9 && x < 12): alert("between 9 and 11"); break; default: alert("none"); break; }
请记住,这增加了一个人为错误的额外点 – 有人可能会尝试更新范围,但忘记在两个地方改变它,留下一个没有覆盖的重叠或差距。 例如在这里8的情况下,现在不匹配任何东西,当我只是编辑的情况下,匹配8。
case (x >= 5 && x < 8): alert("between 5 and 7"); break; case (x >= 9 && x < 12): alert("between 9 and 11"); break;
switch(this.dealer) { case 1: case 2: case 3: case 4: // Do something. break; case 5: case 6: case 7: case 8: // Do something. break; default: break; }
如果你不喜欢inheritance的情况下,只要去if/else if/else
语句。
这不需要switch语句。 它更清晰 ,更简洁 , 更简单地使用if语句…
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"); }
速度testing
我很好奇使用开关的开销,而不是简单的如果…其他…,所以我把一个jsFiddle来检查它… http://jsfiddle.net/17x9w1eL/
-
Chrome: 开关比其他的要慢70%左右
-
Firefox: 开关比其他的要慢5%左右
-
IE: 开关比其他的要慢5%左右
-
Safari: 开关比其他的要慢95%左右
笔记:
分配给本地variables是可选的,特别是如果您的代码将在稍后自动优化。
对于数字范围,我喜欢使用这种结构…
if (1 <= d && d <= 11) {...}
…因为对我来说,它更接近于你在math中expression范围的方式(1 <= d <= 11),当我读代码时,我可以读作“如果d在1和1之间11" 。
更清晰
有几个人评论说他们不认为这个更清楚。 由于结构与开关选项接近相同,这当然不是那么清楚。 更清晰的主要原因是它的每一部分都是可读的,而且是简单直观的,而“switch(true)”是一个相当无意义的代码行。 许多编码人员,在你的脚本中阅读,将会去“WTF是否意味着? 然后不得不查看它。 这是一个肮脏的黑客,它不直观,而且不清楚。 如果这就是你喜欢的编码方式,而其他人也不需要处理你的代码库,那就去做吧,否则,最好是使用它们的构造。
不,这是不可能的。 你可以得到最接近的是:
switch(this.dealer) { case 1: case 2: case 3: case 4: // DO SMTHIN break; case 5: case 6: case 7: case 8: // DO SMTHIN break;
但是这非常不实。
对于这样的情况,通常使用if
/ else if
结构更好。
如果你需要检查范围,你可能会更好的if
和else if
语句,如下所示:
if (range > 0 && range < 5) { // .. } else if (range > 5 && range < 9) { // .. } else { // Fall through }
一个开关可以在更大的范围内变大。
如果你想要做一些快速,高效和可读的事情,那么使用一个标准的if … then … else结构如下:
var d = this.dealer; if (d < 12) { if (d < 5) { alert("less than five"); }else if (d < 9) { alert("between 5 and 8"); }else{ alert("between 9 and 11"); } }else{ alert("none"); }
如果你想混淆它,使它变得糟糕(但很小),试试这个:
var d=this.dealer;d<12?(d<5?alert("less than five"):d<9?alert("between 5 and 8"):alert("between 9 and 11")):alert("none");
顺便说一句,上面的代码是一个JavaScript的if … then … else速记语句。 这是一个很好的例子,不要写代码,除非混淆或代码缩小是目标。 请注意,如果以这种方式编写代码,维护可能是一个问题。 如果有的话,很less有人能够轻松地阅读它。 然而,代码大小比标准小50%,如果…然后…其他性能没有任何损失。 这意味着在更大的代码库中,这样的缩小可以极大地加速带宽受限或高延迟networking上的代码传输。
但是,这不应该被认为是一个好的答案。 这只是一个可以做什么的例子,而不是做什么。
更可读的三元版本可能如下所示:
var x = this.dealer; alert(t < 1 || t > 11 ? 'none' : t < 5 ? 'less than five' : t <= 8 ? 'between 5 and 8' : 'Between 9 and 11');
function sequentialSizes(val) { var answer = ""; switch (val){ case 1: case 2: case 3: case 4: answer="Less than five"; break; case 5: case 6: case 7: case 8: answer="less than 9"; break; case 8: case 10: case 11: answer="More than 10"; break; } return answer; } // Change this value to test you code to confirm ;) sequentialSizes(1);