本内容来自:《高性能javascript》一书,感觉写的很好摘录下来分享给大家
条件表达式决定了JavaScript程序的流向。其他语言对应该使用if-else语句还是switch语句的传统观点同样适用于JavaScript。由于不同的浏览器针对流程的控制进行了
不同的优化。因此使用哪种技术更好没有定论。
1、if-else对比switch
使用if-else还是switch,最流行的方法是基于测试条件的数量来判断:条件数量越大,越倾向于switch而不是if-else。这通常归结于代码的易读性。这个观点认为,当
循环条件较少时if-else更易读,当条件数量较多时switch更易读。考虑如下代码:
if(found){
//代码处理
}else(){
//其他代码处理
}
switch(found){
case true:
//代码处理
break;
default:
//其他代码处理
}
尽管两块代码完成的是相同的任务,但还是有很多人认为if-else语句比switch更容易度。然而,如果增加条件语句的数量,这种观点会被扭转过来:
if(color == 'red'){
//代码处理
}else if(color == 'blue'){
//代码处理
}else if(color == 'brown'){
//代码处理
}else if(color == 'black'){
//代码处理
}else {
//代码处理
}
switch(color){
case 'red':
//代码处理
break;
case 'blue':
//代码处理
break;
case 'brown':
//代码处理
break;
case 'black':
//代码处理
break;
default :
//代码处理
}
大多数人会认为对于这段代码,switch表达式比if-else表达式可读性更好。
事实证明,大多数情况下switch比if-else运行的要快,但只有当条件数量很大时才能快得明显。这个两个语句主要性能区别是:当条件增加时,if-else性能负担增加的程度比switch要多。
因此,我们自然倾向于在数量较少是使用if-else,而在条件数量较大时使用switch。这从性能方面考虑也是合理的。
通常来说,if-else适用于判断两个离散值或几个不同的值域。当判断多有两个离散值时,switch语句是更佳选择。
2、优化 if-else
优化if-else的目标是:最小化到达正确分支前所需判断的条件数量。最简单的优化方法是确保最可能出现的条件放到首位。考虑如下代码:
if(value < 5){
//代码处理
}else if(value > 5 && value < 10){
//代码处理
}else{
//代码处理
}
该段代码只有当value值经常小于5时才是最优的。如果value大于5或者等于10,那么每次到达正确分支之前必须经过两个判断条件。最终增加了这个语句的所消耗的平均时间。if-else中的条件
语句总应该是按照从最大概率到最小概率的顺序排列,以确保运行速度最快。
另一种减少条件判断次数的方法是把if-else组织成一系列嵌套的if-else语句。使用单个庞大的if-else通常会导致运行缓慢,因为每个条件都学要判断。例如:
if(value == 0){
return result0;
}else if(value == 1){
return result1;
}else if(value == 2){
return result2;
}else if(value == 3){
return result3;
}else if(value == 4){
return result4;
}else if(value == 5){
return result5;
}else if(value == 6){
return result6;
}else if(value == 7){
return result7;
}else if(value == 8){
return result8;
}else if(value == 9){
return result9;
}else if(value == 10){
return result10;
}
在这个if-else表达式中,条件语句最多判断10次。假设value的值在1到10之间均匀分布。那么这会增加平均运行时间。为了最小化条件判断次数,代码可重写为一系列嵌套的if-else语句,比如:
if(value < 6){
if(value < 3){
if(value == 0){
return result0;
}else if(value == 1){
return result1;
}else{
return result2;
}
}else{
if(value == 3){
return result3;
}else if(value == 4){
return result4;
}else {
return result5;
}
}
}else{
if(value < 8){
if(value == 6){
return result6;
}else{
return reuslt7;
}
}else{
if(value == 8){
return result8;
}else if(value == 9){
return result9;
}else{
return result10;
}
}
}
重写后的if-else语句每次到达正确分支最多经过4次条件判断。它使用二分法把值域分成一系列的区间,然后逐步缩小范围。当值的范围均匀分布在0到10之间时,代码运行的平均时间大约是前面例子的一半。
这个方法非常适用于有多个值域需要测试的时候(如果是 离散值,那么switch语句通常更为合适)。