• 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,防止栈溢出

  • 相关阅读:
    KVM克隆CentOS6虚拟机后无法启动
    Python socket网络模块
    LNMP的安装--详细版
    CentOS7 二进制安装MySQL5.6.42
    超越线程池:Java并发并没有你想的那么糟糕
    有哪些实用的计算机相关技能,可以在一天内学会?
    如何写出让hr一看就约你面试的简历
    五个最佳编程字体
    Eclipse 的 Debug 介绍与技巧
    Redis时延问题分析及应对
  • 原文地址:https://www.cnblogs.com/floraCnblogs/p/algorithm.html
Copyright © 2020-2023  润新知