猿问

切换语句大于/小于

切换语句大于/小于

所以我想使用这样的开关语句:

switch (scrollLeft) {
  case (<1000):
   //do stuff
   break;
  case (>1000 && <2000):
   //do stuff
   break;}

现在我知道这些语句(<1000)或(>1000 && <2000)中的任何一个都不起作用(显然有不同的原因)。我要问的是最有效的方法。我讨厌使用30个if语句,所以我宁愿使用switch语法。有什么我可以做的吗?


偶然的你
浏览 570回答 3
3回答

开心每一天1111

当我在其他答案中查看解决方案时,我看到一些我知道对性能有害的事情。我打算将它们放在评论中,但我认为最好对它进行基准测试并分享结果。你可以自己测试一下。下面是我的结果(ymmv)在每个浏览器中最快的操作之后归一化(将1.0时间乘以标准化值以获得以ms为单位的绝对时间)。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chrome&nbsp;Firefox&nbsp;Opera&nbsp;MSIE&nbsp;Safari节点--------------------------------------------------&nbsp;-----------------1.0次37ms&nbsp;73ms&nbsp;68ms&nbsp;184ms&nbsp;73ms&nbsp;21msif-immediate&nbsp;1.0&nbsp;1.0&nbsp;1.0&nbsp;2.6&nbsp;1.0&nbsp;1.0if-indirect&nbsp;1.2&nbsp;1.8&nbsp;3.3&nbsp;3.8&nbsp;2.6&nbsp;1.0switch-immediate&nbsp;2.0&nbsp;1.1&nbsp;2.0&nbsp;1.0&nbsp;2.8&nbsp;1.3开关范围38.1&nbsp;10.6&nbsp;2.6&nbsp;7.3&nbsp;20.9&nbsp;10.4switch-range2&nbsp;31.9&nbsp;8.3&nbsp;2.0&nbsp;4.5&nbsp;9.5&nbsp;6.9switch-indirect-array&nbsp;35.2&nbsp;9.6&nbsp;4.2&nbsp;5.5&nbsp;10.7&nbsp;8.6array-linear-switch&nbsp;3.6&nbsp;4.1&nbsp;4.5&nbsp;10.0&nbsp;4.7&nbsp;2.7array-binary-switch&nbsp;7.8&nbsp;6.7&nbsp;9.5&nbsp;16.0&nbsp;15.0&nbsp;4.9使用以下版本测试在Windows 7 32位上执行的操作:Chrome 21.0.1180.89m,Firefox 15.0,Opera 12.02,MSIE 9.0.8112,Safari 5.1.7。节点在Linux 64位盒上运行,因为Node.js for Windows上的计时器分辨率是10ms而不是1ms。如果,即时这是所有测试环境中最快的,除了......&nbsp;鼓乐&nbsp;MSIE!(惊讶,惊讶)。这是实现它的推荐方法。if&nbsp;(val&nbsp;<&nbsp;1000)&nbsp;{&nbsp;/*do&nbsp;something&nbsp;*/&nbsp;}&nbsp;elseif&nbsp;(val&nbsp;<&nbsp;2000)&nbsp;{&nbsp;/*do&nbsp;something&nbsp;*/&nbsp;}&nbsp;else...if&nbsp;(val&nbsp;<&nbsp;30000)&nbsp;{&nbsp;/*do&nbsp;something&nbsp;*/&nbsp;}&nbsp;else如果间接这是一种变体,switch-indirect-array但使用if-statements代替,并且比switch-indirect-array几乎所有测试环境都要快得多。values=[ &nbsp;&nbsp;&nbsp;1000,&nbsp;&nbsp;2000,&nbsp;...&nbsp;30000];if&nbsp;(val&nbsp;<&nbsp;values[0])&nbsp;{&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;}&nbsp;elseif&nbsp;(val&nbsp;<&nbsp;values[1])&nbsp;{&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;}&nbsp;else...if&nbsp;(val&nbsp;<&nbsp;values[29])&nbsp;{&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;}&nbsp;else开关,立即这在所有测试环境中都非常快,实际上是MSIE中最快的。它可以在您进行计算以获取索引时起作用。switch&nbsp;(Math.floor(val/1000))&nbsp;{ &nbsp;&nbsp;case&nbsp;0:&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break; &nbsp;&nbsp;case&nbsp;1:&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break; &nbsp;&nbsp;... &nbsp;&nbsp;case&nbsp;29:&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break;}开关范围这比所有测试环境中最快的速度慢6到40倍,除了Opera需要大约1.5倍的时间。它很慢,因为引擎必须为每种情况比较两次值。令人惊讶的是,与Chrome中最快的操作相比,Chrome完成此操作所需的时间要长近40倍,而MSIE只需要6倍的时间。但实际时差仅为74毫秒,有利于MSIE为1337毫秒(!)。switch&nbsp;(true)&nbsp;{ &nbsp;&nbsp;case&nbsp;(0&nbsp;<=&nbsp;val&nbsp;&&&nbsp;&nbsp;val&nbsp;<&nbsp;1000):&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break; &nbsp;&nbsp;case&nbsp;(1000&nbsp;<=&nbsp;val&nbsp;&&&nbsp;&nbsp;val&nbsp;<&nbsp;2000):&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break; &nbsp;&nbsp;... &nbsp;&nbsp;case&nbsp;(29000&nbsp;<=&nbsp;val&nbsp;&&&nbsp;&nbsp;val&nbsp;<&nbsp;30000):&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break;}开关范围2这是一个变体,switch-range但每个案例只有一个比较因此更快,但除了Opera之外仍然非常慢。case语句的顺序很重要,因为引擎将以源代码顺序ECMAScript262:5 12.11测试每个案例switch&nbsp;(true)&nbsp;{ &nbsp;&nbsp;case&nbsp;(val&nbsp;<&nbsp;1000):&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break; &nbsp;&nbsp;case&nbsp;(val&nbsp;<&nbsp;2000):&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break; &nbsp;&nbsp;... &nbsp;&nbsp;case&nbsp;(val&nbsp;<&nbsp;30000):&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break;}切换-间接阵列在该变体中,范围存储在阵列中。这在所有测试环境中都很慢,而在Chrome中则非常慢。values=[1000,&nbsp;&nbsp;2000&nbsp;...&nbsp;29000,&nbsp;30000];switch(true)&nbsp;{ &nbsp;&nbsp;case&nbsp;(val&nbsp;<&nbsp;values[0]):&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break; &nbsp;&nbsp;case&nbsp;(val&nbsp;<&nbsp;values[1]):&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break; &nbsp;&nbsp;... &nbsp;&nbsp;case&nbsp;(val&nbsp;<&nbsp;values[29]):&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break;}阵列线性搜索这是对数组中值的线性搜索和具有固定值的switch语句的组合。人们可能想要使用它的原因是直到运行时才知道这些值。在每个测试环境中都很慢,在MSIE中需要几乎10倍的时间。values=[1000,&nbsp;&nbsp;2000&nbsp;...&nbsp;29000,&nbsp;30000];for&nbsp;(sidx=0,&nbsp;slen=values.length;&nbsp;sidx&nbsp;<&nbsp;slen;&nbsp;++sidx)&nbsp;{ &nbsp;&nbsp;if&nbsp;(val&nbsp;<&nbsp;values[sidx])&nbsp;break;}switch&nbsp;(sidx)&nbsp;{ &nbsp;&nbsp;case&nbsp;0:&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break; &nbsp;&nbsp;case&nbsp;1:&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break; &nbsp;&nbsp;... &nbsp;&nbsp;case&nbsp;29:&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break;}阵列二进制开关这是array-linear-switch二进制搜索的变体。不幸的是它比线性搜索慢。我不知道这是我的实现还是线性搜索更优化。它也可能是键空间很小。values=[0,&nbsp;1000,&nbsp;&nbsp;2000&nbsp;...&nbsp;29000,&nbsp;30000];while(range)&nbsp;{ &nbsp;&nbsp;range&nbsp;=&nbsp;Math.floor(&nbsp;(smax&nbsp;-&nbsp;smin)&nbsp;/&nbsp;2&nbsp;); &nbsp;&nbsp;sidx&nbsp;=&nbsp;smin&nbsp;+&nbsp;range; &nbsp;&nbsp;if&nbsp;(&nbsp;val&nbsp;<&nbsp;values[sidx]&nbsp;)&nbsp;{&nbsp;smax&nbsp;=&nbsp;sidx;&nbsp;}&nbsp;else&nbsp;{&nbsp;smin&nbsp;=&nbsp;sidx;&nbsp;}}switch&nbsp;(sidx)&nbsp;{ &nbsp;&nbsp;case&nbsp;0:&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break; &nbsp;&nbsp;... &nbsp;&nbsp;case&nbsp;29:&nbsp;/*&nbsp;do&nbsp;something&nbsp;*/&nbsp;break;}结论如果性能很重要,请使用if-statements或switch使用立即值。

喵喵时光机

switch&nbsp;(Math.floor(scrollLeft/1000))&nbsp;{ &nbsp;&nbsp;case&nbsp;0:&nbsp;//&nbsp;(<1000) &nbsp;&nbsp;&nbsp;//do&nbsp;stuff &nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;case&nbsp;1:&nbsp;//&nbsp;(>=1000&nbsp;&&&nbsp;<2000) &nbsp;&nbsp;&nbsp;//do&nbsp;stuff; &nbsp;&nbsp;&nbsp;break;}只有经常步骤才有效...

BIG阳

我讨厌使用30 if语句我最近有同样的情况,这就是我解决它的方式:之前:if(wind_speed&nbsp;>=&nbsp;18)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;scale&nbsp;=&nbsp;5;}&nbsp;else&nbsp;if(wind_speed&nbsp;>=&nbsp;12)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;scale&nbsp;=&nbsp;4;}&nbsp;else&nbsp;if(wind_speed&nbsp;>=&nbsp;9)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;scale&nbsp;=&nbsp;3;}&nbsp;else&nbsp;if(wind_speed&nbsp;>=&nbsp;6)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;scale&nbsp;=&nbsp;2;}&nbsp;else&nbsp;if(wind_speed&nbsp;>=&nbsp;4)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;scale&nbsp;=&nbsp;1;}后:var&nbsp;scales&nbsp;=&nbsp;[[4,&nbsp;1],&nbsp;[6,&nbsp;2],&nbsp;[9,&nbsp;3],&nbsp;[12,&nbsp;4],&nbsp;[18,&nbsp;5]];scales.forEach(function(el){if(wind_speed&nbsp;>&nbsp;el[0])&nbsp;scale&nbsp;=&nbsp;el[1]});如果你设置“1,2,3,4,5”,那么它可以更简单:var&nbsp;scales&nbsp;=&nbsp;[4,&nbsp;6,&nbsp;9,&nbsp;12,&nbsp;18];scales.forEach(function(el){if(wind_speed&nbsp;>=&nbsp;el)&nbsp;scale++});
随时随地看视频慕课网APP
我要回答