JavaScript 高性能优化

如何减少页面的reflow
  1. 在文档外创建并更新一个文档片段,然后把文档片段放入页面。(推荐)

    
    var frag = document.createDocumentFragment();
    
    for (...) {
        frag.appendChild(document.createElement('div'));
    }
    
    document.getElementById('container').appendChild(frag);
    
    
  2. 临时移除更新节点,操作完成后再恢复它。

    
    var container = document.getElementById('container');
    
    container.style.display = 'none';
    
    for (...) {
        container.appendChild(document.createElement('div'));
    }
    
    container.style.display = 'normal';
    
    
  3. 创建更新节点的副本,在副本上进行相关的操作,最后用副本覆盖原节点。

    
    var old = document.getElementById('container');
    
    var clone = old.CloneNode(true);
    
    for (...) {
        clone.appendChild(...);
    }
    
    old.parentNode.replaceNode(clone, old);
    
    
For循环优化
  1. 缓存循环长度

    
    var arr = [1, 2, 3, 4];
    
    // len 缓存数组长度
    for (var i = 0, len = arr.length; i < len; i++) {
        ...
    }
    
    
  2. 倒序循环

    
    var arr = [1, 2, 3, 4];
    
    // 使用倒序遍历
    for (var i = arr.length; i--;) {
        ...
    }
    
    
  3. 达夫设备

    
    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    
    // 假设达夫设备每次循环调用8次程序
    var len = arr.length,
    
        // 等价于 i % 8,这里是为了体现更好的性能,项目中严禁写这样代码
        i = len - ((len >> 3) << 3);
    
    while (i) {
        process(arr[i--]);
    }
    
    // 等价于 i / 8,这里是为了体现更好的性能,项目中严禁写这样代码
    i = Math.floor(len >> 3);
    
    while (i) {
        process(arr[i--]);
        process(arr[i--]);
        process(arr[i--]);
        process(arr[i--]);
        process(arr[i--]);
        process(arr[i--]);
        process(arr[i--]);
        process(arr[i--]);
    }
    
    
避免二次评估
var num1 = 12,
    num2 = 23,
    sum = 0;

以下这些用法不应该出现:一般 eval 和 fucntion 很少会用,后面

  1. eval

    sum = eval('num1 + num2');
    
    
  2. function

    sum = new Function('num1', 'num2', 'return num1 + num2');
    
    
  3. setTimeout

    setTimeout('sum = num1 + num2', 100);
    
    
  4. setInterval

    setInterval('sum = num1 + num2', 100);
    
    
字符串拼接
  1. IE7-

    var arr = ['John', 'Neal', 'Somit', 'Tom'];
    
    var str = [];
    for (var i = arr.length; i--;) {
        str.push('<div id="'+ i +'">'+ arr[i] +'</div>');
    }
    str = str.join('');
    
    // do something else
    
    
  2. IE8+ & 其他浏览器

    var arr = ['John', 'Neal', 'Somit', 'Tom'];
    
    var str = '';
    for (var i = arr.length; i--;) {
        str = str + '<div id="'+ i +'">'+ arr[i] +'</div>';
    }
    
    // do someting else
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.什么叫做设计模式(基本概念) 在面向对象软件设计过程中,针对问题进行简洁而优雅的一种解决方案 设计模式是在某种...
    Jianshu9527阅读 349评论 0 3
  • 以下是常用的代码收集,学习用。转自豪情博客园 1. PC - js 返回指定范围的随机数(m-n之间)的公式 re...
    自由加咖啡阅读 1,027评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,778评论 18 399
  • 面向对象编程 1.创建,使用函数 var CheckObject = {checkName : function(...
    依米花1993阅读 402评论 0 0
  • 感赏自己走出了舒适地带,挑战自己的能力,走出来的时候表姐给我介绍了一个好工作。 感赏遇到一个好老板,平时会经常请我...
    许晓凌_中阅读 160评论 0 0