Javascript 如果是Else If链还是multiple If

Javascript 如果是Else If链还是multiple If,javascript,if-statement,Javascript,If Statement,假设我有一个随机数 哪一个更有效: if (num == 1) { } else if (num ==2) { } else if (num == 3) { } else if (num == 4) { } else if (num == 5) { } else {}; 或 在性能方面是否有很多不同之处 或者我应该做一个切换链吗?如果您有少数情况需要单独处理(并且您使用一个数字来区分),那么switch语句将为试图阅读或修改代码的人(包括您)提供更清晰的逻辑 If/else If以后

假设我有一个随机数

哪一个更有效:

if (num == 1) {

} else if (num ==2) {

} else if (num == 3) {

} else if (num == 4) {

} else if (num == 5) {

} else {};

在性能方面是否有很多不同之处


或者我应该做一个切换链吗?

如果您有少数情况需要单独处理(并且您使用一个数字来区分),那么
switch
语句将为试图阅读或修改代码的人(包括您)提供更清晰的逻辑

If/else If
以后可能会误判链


连续的
If
语句意味着您不断地检查您知道是错误的情况

通常,否则If的性能比If链好。但是在这种情况下使用switch case是最好的选择。

检查的有效方法是switch语句,而不是if

switch(num) {  
  case 1:  
    do something;
    break;  
  case 2:  
    do something;
    break;  
  default:  
    default do something;  
} 

派对有点晚了,但除了其他有效答案:
如果你可以直接(几乎)调用你想要的子代码(如果你有很多选择的话)

我有一个不同的解决方案(您有其他选择):

编辑:或者(扩展上述概念)使用对象(因为不必像数组那样保证顺序)和一些闭包,以及一种将
num
传递给处理函数的简单方法:

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
根据用例,上面的一个(或混合)可能是更好的解决方案。如果执行时间为prime,则不要使用helper函数(进行检查),因为这样可以保存函数调用

编辑2:

在评论中,询问此备选方案的好处:

与流行的观点相反(javascript/ecmascript使用
开关“直接跳”到代码块的起点),现代浏览器中的switch语句使用
==
严格比较运算符计算
大小写
表达式(因此表达式必须匹配,无需任何类型转换)按照它们(
大小写
而不是
默认值
)出现的顺序,直到它找到一个匹配的值(在此之后,当遇到函数内部或代码块结束时,
中断
返回
将“失效”,因此
默认
可以出现在代码块中的任何位置,而不仅仅是在末尾)。
这是因为ECMAScript v3标准允许每个大小写后面跟着一个任意表达式

注意(对于较旧的浏览器)switch语句是在JavaScript 1.2中实现的,但它不完全符合ECMAScript规范。在JavaScript 1.2中,大小写表达式必须是不涉及任何变量或方法调用的文本或编译时常量。此外,尽管ECMAScript允许开关和大小写表达式为任何类型,但Java脚本1.2和JavaScript 1.3要求表达式计算为原始数字、字符串或布尔值。
资料来源:

看到if链的相似之处了吗?不同之处在于它的坠落能力(直到结束/断裂/返回)。
因此,比较工作的数量(在一个例子中,您有许多不同的情况)是相同的(至少,每个规范,不保证每个解释器实现,这在不同版本之间差异很大)

很多优化(通常不反对)都涉及到调整代码以获得可预测的相对可伸缩的(相对于主机的能力)执行时间。在我的建议中(旨在展示思维方式),在有效负载执行之前,您有一小部分固定的步数(根据语言规范可以保证的东西)

这就留下了“可理解性”,这是一个棘手的问题,因为它与“意图”和“可读性”高度相关,从而打开了一个关于不同观点/选项/咒语/最佳实践的漏洞,其中许多观点/选项/咒语/最佳实践对“javascript”(用于基于web的应用程序)具有不同的价值(或者干脆不适用/不适用)(在我看来)。
可以想到许多不同的方法使用注释等(或使用对象的第二个示例)和不同的编码样式/模式,这将减轻最初感觉到的“清晰代码”的障碍。
毕竟,理想情况下,一个人应该有良好的文档化的“原始”((gzip-)预优化(您不想维护/调试原始代码和“编译”代码))代码,但要向浏览器(在生产中)发送缩小的(无文档/注释缩小的变量名称等)代码

最后,关于性能,同样取决于一个人正在尝试做什么(并且涉及到很多情况),数组版本(没有辅助函数)对于一系列数字情况来说将是最小和最快的。然后,对象在(不规则的)数字间隔和基于字符串的开关中具有其强度。但是,与往常一样,必须进行测试(支持的目标)主机/浏览器来评估它们的性能。但是到目前为止,根据我处理很多案例的经验,这一个是赢家


最后请注意,例如,在处理一组已知的案例时,甚至不需要检查案例是否存在,更不用说需要一个帮助函数。.赢得的速度(在这种情况下)。

更好的方法,尤其是对于大型代码,是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")}
if(5>3){
警惕(“真实”);
} 
如果(5<3){
警报(“假”)}

它将执行与前面代码相同的操作,但现在它将执行两次计算,而不是一次计算。是的,为此使用一个开关。可能重复的井,它们的工作方式完全不同(通常)。第一个示例将只测试条件,直到找到一个解析为
tr的条件
if (5 > 3){
alert("True");
} 
else{
alert("False");
}
if (5 > 3){
    alert("True");
    } 
if (5 < 3){
alert("False")}