JavaScript的算法和流程控制总结

代码的整体结构是影响运行速度的主要因素之一。代码数量少一定原型速度快,代码数量多却不意味着运行速度一定慢。

1. 循环

  类型:

     1) for由初始化、前测条件、后执行体、循环体组成: for(var i=0;i<10;i++) {循环体}  => for(var i=0,j=10;i<j;i++) {}

   2) while由前测条件和循环体组成:var i=0; while(i<10){循环主体 i++;} 

   3) do-while由后测条件和循环体组成, 循环体会至少运行一次操作,再由后侧条件决定是否再次运行:var i=0; do{循环主体} while(i++<10);

   4) for-in可以枚举任何对象的属性名:for(var prop in object) {}

  性能:

   1) for-in性能差一点,相同迭代数,速度为1/7

   2) 性能差不多需要考虑1每次迭代的处理事务2迭代的次数

   3) 优化:

    减少迭代的工作量:减少对象成员及数组项的查询次数;颠倒数组的顺序,如倒序循环(条件只是简单的与0比较);

    减少迭代次数:达夫设备,使一次迭代代替多次迭代操作

        var iterations = Math.floor(items.length/8),   <=>  速度快       var i = items.length % 8,             

            startAt = items.length % 8,                   while(i){

          i  =  0;                            process(items[i--]);

        do {                                }

          switch(startAt) {                       i = Math.floor(items.length/8);

            case 0: process(items[i++]);                while(i) {

            case 7: process(items[i++]);                 process(items[i--]);

            case 6: process(items[i++]);                 process(items[i--]);

            case 5: process(items[i++]);                   process(items[i--]);

            case 4: process(items[i++]);                 process(items[i--]);

            case 3: process(items[i++]);                 process(items[i--]);

            case 2: process(items[i++]);                 process(items[i--]);

            case 1: process(items[i++]);                 process(items[i--]);

           }                                    process(items[i--]);

          startAt = 0;                          }

        }while(--iterations);

  基于函数迭代

  items.forEach(function(value, index, array){//当前数值项的值、索引、数组本身.

    process(value);  

  })

2. 条件语句

  1) 条件数越多(多余两个),使用switch而不是if-else。

if (color == 'red') {                                             switch(color) {       

  //代码处理                     case "red":

} else if (color == 'blue') {                 //代码处理

  //代码处理                         break;

} else {                        case "blue":

  //代码处理                         //代码处理

}                              break;

                            default:

                                //代码处理

  2) 单个键和单个值之间存在逻辑映射时,判断条件较多时,查找表比if和switch要快。

3. 递归

   function factorial(n) {

   if (n==0) {

      return 1;

   } else {

      return n*factotial(n-1);

   }

 }//存在问题:条件不明确或缺少终止条件会导致函数长时间运行,并使得用户界面处于假死状态。还有调用栈大小的限制

   1) 调用栈限制,调用栈的大小限制了递归算法在JavaScript中的应用

    取溢出异常   try {

             recurse();

          } catch {

           alert("too much recursion!");

          }

   2) 递归模式:直接递归模式(函数调用自身); 隐伏模式(两个函数相互调用,形成一个无限循环)

   3) 迭代,防止栈溢出

    合并排序算法是最常见的用递归实现咋算法。

 4) Memoization,防止栈溢出

原文地址:https://www.cnblogs.com/floraCnblogs/p/algorithm.html