说我有一个随机数。
哪个更有效:
if (num == 1) {
} else if (num ==2) {
} else if (num == 3) {
} else if (num == 4) {
} else if (num == 5) {
} else {};
或
if (num == 1) {};
if (num == 2) {};
if (num == 3) {};
if (num == 4) {};
if (num == 5) {};
有很多不同的表现吗?
或者我应该做一个开关链吗?
答案 0 :(得分:3)
如果您想要单独处理少数情况(并且使用数字来区分),那么Switch
语句将为尝试阅读的某人(包括您)提供更清晰的逻辑或修改你的代码。
If / else if
链可能会被误认为
连续If
语句意味着您不断检查您认为错误的情况
答案 1 :(得分:2)
派对有点迟,但除了其他有效答案外:
如果你可以直接调用你想要的子代码(几乎) (如果你有很多选项)....
我有一个不同的解决方案(你打开了其他选项):
var switchArr=[ //skipping 0
, function(){ /* do stuff for 1 */ }
, function(){ /* do stuff for 2 */ }
, function(){ /* do stuff for 3 */ }
]; // you could also set them directly if you have irregular (large) intervals
if(switchArr[num]){
switchArr[num]();
} else {
//defaults
}
编辑:或(扩展上述概念)使用对象(因为顺序不必像数组那样得到保证)和一些闭包以及传递{{1}的简单方法处理程序函数:
num
根据用例,上述之一(或混合型)可能是更好的解决方案。如果执行时间处于素数,则不要使用辅助函数(执行检查),因为这样可以保存函数调用。
编辑2:
在评论中要求提供此替代方案的好处:
与流行的观点相反(javascript / ecmascript使用var switcher=(function(){
var N, F={
default: function(){ alert('default function for '+N); }
, 1: function(){ alert('doing stuff for '+N); }
, 2: function(){ alert('other stuff for '+N); }
, 5: function(){ alert('I am function '+N); }
};
return function(n){ F[N=n] ? F[n]() : F.default(); };
})();
num=3; switcher(num); // default function for 3
num=5; switcher(num); // I am function 5
“直接跳转到代码块中的起点”,现代浏览器中的switch语句会评估{使用switch
严格比较运算符的{1}}表达式(因此表达式必须匹配而不进行任何类型转换)按照它们(case
而非===
)出现的顺序直到它会找到一个与相匹配的值(在遇到函数内部或代码块结束时,case
或default
之后它将“落实”,因此break
可以出现在代码块的任何地方,而不仅仅是在最后)
这是因为ECMAScript v3 标准允许每个案例后跟任意表达。
注意(对于旧浏览器)switch语句是在JavaScript 1.2中实现的,但它并不完全符合ECMAScript规范。在JavaScript 1.2中,case表达式必须是不涉及任何变量或方法调用的文字或编译时常量。此外,尽管ECMAScript允许switch和case表达式为任何类型,但JavaScript 1.2和JavaScript 1.3要求表达式求值为原始数字,字符串或布尔值。
来源:JavaScript: The Definitive Guide (4th ed)
看到if-chain的相似之处?不同之处在于能够通过(直到结束/休息/返回) 比较工作的数量(在一个例子中,你有很多不同的情况)是相同的(至少,每个规范,不保证每个解释器实现,这在版本之间有很大的不同)。
许多(通常不是不赞成)优化涉及调整代码以具有可预测的相对可伸缩性(关于主机的能力)执行时间。在我的建议中(旨在显示思维方式的大小),在有效负载执行之前,您有一个小的固定的步数(根据语言规范,您可以保证这一点)。
这留下了“可理解性”,这是一个棘手的问题,因为它与“意图”和“可读性”高度相关,因此打开了关于不同观点/选项/口头禅/最佳实践的蠕虫,其中大部分都有不同价值(或简单地说不应该/不应该)到'javascript'(对于基于网络的应用程序)(在我看来)。
可以考虑使用注释等(或使用对象的第二个示例)和不同的编码样式/模式的许多不同方法,这些方法可以减轻最初感知到的“清除代码”的障碍。
总而言之,理想情况下,应该有一个良好的文档“原始”((gzip-)预先优化适用(你不想维护/调试原始和'编译'代码))代码,但发送缩小(没有doc) / comments minified var-names etc)代码到浏览器(在生产中)。
最后关于性能,再次取决于一个人想要做什么(并涉及很多情况),数组版本(没有辅助函数)对于一系列数值情况将是最小和最快的。然后,物体具有(不规则的)数值区间和基于弦的开关的强度。但是,与往常一样,必须测试(支持目标)主机/浏览器以评估其性能。不过到目前为止,根据我的经验在处理大量案件时,这个人是胜利者。
最后的注意事项,例如在处理一组已知案例时,甚至不需要检查案例是否存在,更不用说需要辅助函数..胜利的速度(在这种情况下)。 / p>
答案 2 :(得分:1)
一般来说 - 如果有比if链更好的性能。但在这种情况下使用开关盒将是最好的选择。
答案 3 :(得分:1)
检查的有效方法是switch语句而不是if,
switch(num) {
case 1:
do something;
break;
case 2:
do something;
break;
default:
default do something;
}
答案 4 :(得分:0)
对于大代码而言,更好的方法是if else语句(甚至更好的情况)。 使用多个if语句会导致pc进行不必要的计算。 例如:
if (5 > 3){
alert("True");
}
else{
alert("False");
}
这是一个布尔表达式。在上面的例子中,cpu检查if(5> 3)返回true并停止(它不会执行或检查else)。 相同但使用多个if
if (5 > 3){
alert("True");
}
if (5 < 3){
alert("False")}
它将与之前的代码相同,但现在它将执行2次计算而不是一次