• JavaScript性能优化之小知识总结


    1.避免全局查找

    在一个函数中会用到全局对象存储为局部变量来减少全局查找,因为访问局部变量的速度要比访问全局变量的速度更快些

    2.定时器

    如果针对的是不断运行的代码,不应该使用setTimeout,而应该是用setInterval,因为setTimeout每一次都会初始化一个定时器,而setInterval只会在开始的时候初始化一个定时器

    3.字符串连接

    如果要连接多个字符串,应该少使用+=,

    1
    2
    3
    s+=a;
    s+=b;
    s+=c;

    应该写成s+=a + b + c;

    而如果是收集字符串,比如多次对同一个字符串进行+=操作的话,最好使用一个缓存,使用JavaScript数组来收集,最后使用join方法连接起来

    1
    2
    3
    4
    5
    var buf = [];
    for (var i = 0; i < 100; i++) {
    buf.push(i.toString());
    }
    var all = buf.join("");

    4.避免with语句

    和函数类似 ,with语句会创建自己的作用域,因此会增加其中执行的代码的作用域链的长度,由于额外的作用域链的查找,在with语句中执行的代码肯定会比外面执行的代码要慢,在能不使用with语句的时候尽量不要使用with语句。

    5.数字转换成字符串

    般最好用”" + 1来将数字转换成字符串,虽然看起来比较丑一点,但事实上这个效率是最高的

    6.浮点数转换成整型

    很多人喜欢使用parseInt(),其实parseInt()是用于将字符串转换成数字,而不是浮点数和整型之间的转换,我们应该使用Math.floor()或者Math.round()

    7.多个类型声明

    在JavaScript中所有变量都可以使用单个var语句来声明,这样就是组合在一起的语句,以减少整个脚本的执行时间

    8.插入迭代器

    如var name=values[i]; i++;前面两条语句可以写成var name=values[i++]

    9.使用直接量

    10.删除DOM节点

    删除dom节点之前,一定要删除注册在该节点上的事件,不管是用observe方式还是用attachEvent方式注册的事件,否则将会产生无法回收的内存。另外,在removeChild和innerHTML=''二者之间,尽量选择后者. 因为在sIEve(内存泄露监测工具)中监测的结果是用removeChild无法有效地释放dom节点

    11.使用事件代理

    任何可以冒泡的事件都不仅仅可以在事件目标上进行处理,目标的任何祖先节点上也能处理,使用这个知识就可以将事件处理程序附加到更高的地方负责多个目标的事件处理,同样,对于内容动态增加并且子节点都需要相同的事件处理函数的情况,可以把事件注册提到父节点上,这样就不需要为每个子节点注册事件监听了。另外,现有的js库都采用observe方式来创建事件监听,其实现上隔离了dom对象和事件处理函数之间的循环引用,所以应该尽量采用这种方式来创建事件监听

    12.减值迭代

    大多数循环使用一个从0开始、增加到某个特定值的迭代器,在很多情况下,从最大值开始,在循环中不断减值的迭代器更加高效

    13.简化循环体

    循环体是执行最多的,所以要确保其被最大限度的优化

    14.使用后测试循环

    在JavaScript中,我们可以使用for(;;),while(),for(in)三种循环,事实上,这三种循环中for(in)的效率极差,因为他需要查询散列键,只要可以,就应该尽量少用。for(;;)和while循环,while循环的效率要优于for(;;),可能是因为for(;;)结构的问题,需要经常跳转回去

    15.尽量少使用eval函数

    使用eval相当于在运行时再次调用解释引擎对内容进行运行,需要消耗大量时间,而且使用Eval带来的安全性问题也是不容忽视的。

    16.使用常量

    重复值:任何在多处用到的值都应该抽取为一个常量

    用户界面字符串:任何用于显示给用户的字符串,都应该抽取出来以方便国际化
    URLs:在Web应用中,资源位置很容易变更,所以推荐用一个公共地方存放所有的URL
    任意可能会更改的值:每当你用到字面量值的时候,你都要问一下自己这个值在未来是不是会变化,如果答案是“是”,那么这个值就应该被提取出来作为一个常量。
    避免与null进行比较

    由于JavaScript是弱类型的,所以它不会做任何的自动类型检查,所以如果看到与null进行比较的代码,尝试使用以下技术替换

    如果值应为一个引用类型,使用instanceof操作符检查其构造函数

    如果值应为一个基本类型,作用typeof检查其类型

    如果是希望对象包含某个特定的方法名,则使用typeof操作符确保指定名字的方法存在于对象上

    17.释放javascript对象

    18.性能方面的注意事项

    1、尽量使用原生方法

    2、switch语句相对if较快

    通过将case语句按照最可能到最不可能的顺序进行组织

    3、位运算较快

    当进行数字运算时,位运算操作要比任何布尔运算或者算数运算快

    4、巧用||和&&布尔运算符

    19.何时用单引号,何时用双引号

    虽然在JavaScript当中,双引号和单引号都可以表示字符串, 为了避免混乱,我们建议在HTML中使用双引号,在JavaScript中使用单引号,但为了兼容各个浏览器,也为了解析时不会出错,定义JSON对象时,最好使用双引号

    20.文件编码统一用UTF-8

    JavaScript 程序应该尽量放在 .js 的文件中,需要调用的时候在 HTML 中以 <script src=”filename.js”> 的形式包含进来。JavaScript 代码若不是该 HTML 文件所专用的,则应尽量避免在 HTML 文件中直接编写 JavaScript 代码。因为这样会大大增加 HTML 文件的大小,无益于代码的压缩和缓存的使用。另外,<script src=”filename.js”> 标签应尽量放在文件的后面,最好是放在</body>标签前。这样会降低因加载 JavaScript 代码而影响页面中其它组件的加载时间。
    永远不要忽略代码优化工作,重构是一项从项目开始到结束需要持续的工作,只有不断的优化代码才能让代码的执行效率越来越好

  • 相关阅读:
    【C++】C++中的流
    【C++】C++中类的基本使用
    【Python】解析Python中的条件语句和循环语句
    【C++】C++中的分离式编译
    【C++】C++中assert和ENDEGU预处理语句
    【C++】C++中的函数的基本使用
    【算法】解析IEEE 754 标准
    【ThinkPHP】解析ThinkPHP5创建模块
    【C++】C++中的迭代器
    【算法】解析位运算
  • 原文地址:https://www.cnblogs.com/cwzqianduan/p/8795163.html
Copyright © 2020-2023  润新知