var length = items.length;for(var i = 0; i < length; i++) process(items[i]);var j = 0;while(j < length)process(items[j++]);var k = 0;do { process(items[k++]);} while(k < length);上面的每个循环中,每次运行循环体时都会产生这样的操作:for(var i = items.length; i--; ) process(items[i]);var j = items.length;while(j--)process(items[j]);var k = items.length - 1;do { process(items[k]);} while(k--);本例中使用了倒序循环,并把减法操作整合在循环条件中。现在每个控制条件只是简单地与0比较。控制条件与true值比较,任何非零数会自动转换为true,而零值等同于false。实际上,控制条件从两个比较(迭代数少于总数吗?它是true吗?)减少到一次比较(它是true吗?)。每次迭代从两次比较减少到一次,进一步提高了循环速度。// init arrayvar a = [];var length = 10;for(var i = 0; i < length; i++) a[i] = 1;function for_in() { var sum = 0; for(var i in a) sum += a[i];}function for_each() { var sum = 0; a.forEach(function(value, index, array) {sum += value; });}function for_normal() { var sum = 0; for(var i = 0; i < length; i++)sum += a[i];}function for_reverse() { var sum = 0; for(var i = length; i--; )sum += a[i];}function while_normal() { var sum = 0; var i = 0; while(i < length) sum += a[i++];}function while_reverse() { var sum = 0; var i = length; while(i--) sum += a[i];}function do_while_normal() { var sum = 0; var i = 0; do {sum += a[i++]; } while(i < length);}function do_while_reverse() { var sum = 0; var i = length - 1; do {sum += a[i]; } while(i--);}setTimeout(function() { console.profile(); for_in(); for_each(); for_normal(); for_reverse(); while_normal(); while_reverse(); do_while_normal(); do_while_reverse(); console.profileEnd();}, 1000);当数组长度为100时,我们发现firefox下的结果确实和预料的相似:for-each和for-in效率低下,倒序比正序效率略微提升。(chrome下的profiles由于时间太短不显示)

小结:
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 {return result10;}最坏的情况下(value=10)我们可能要做10次判断才能返回正确的结果,那么我们怎么优化这段代码呢?一个显而易见的优化策略是将最可能的取值提前判断,比如value最可能等于5或者10,那么将这两条判断提前。但是通常情况下我们并不知道(最可能的选择),这时我们可以采取二叉树查找策略进行性能优化。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 result7;}} else {if (value == 8){return result8;} else if (value == 9){return result9;} else {return result10;}}}这样优化后我们最多进行4次判断即可,大大提高了代码的性能。这样的优化思想有点类似二分查找,和二分查找相似的是,只有value值是连续的数字时才能进行这样的优化。但是代码这样写的话不利于维护,如果要增加一个条件,或者多个条件,就要重写很多代码,这时switch-case语句就有了用武之地。switch(value){case 0:return result0;case 1:return result1;case 2:return result2;case 3:return result3;case 4:return result4;case 5:return result5;case 6:return result6;case 7:return result7;case 8:return result8;case 9:return result9;default:return result10;}swtich-case语句让代码显得可读性更强,而且swtich-case语句还有一个好处是如果多个value值返回同一个结果,就不用重写return那部分的代码。一般来说,当case数达到一定数量时,swtich-case语句的效率是比if-else高的,因为switch-case采用了branch table(分支表)索引来进行优化,当然各浏览器的优化程度也不一样。var results = [result0, result1, result2, result3, result4, result5, result6, result7, result8, result9, result10];//return the correct resultreturn results[value];当数据量很大的时候,查找表的效率通常要比if-else语句和swtich-case语句高,查找表能用数字和字符串作为索引,而如果是字符串的情况下,最好用对象来代替数组。当然查找表的使用是有局限性的,每个case对应的结果只能是一个取值而不能是一系列的操作。