JS性能优化笔记搜索整理


Posted in Javascript onAugust 21, 2013

通过网上查找资料了解关于性能优化方面的内容,现简单整理,仅供大家在优化的过程中参考使用,如有什么问题请及时提出,再做出相应的补充修改。

一、 让代码简洁:一些简略的表达方式也会产生很好的优化

eg:x=x+1;在不影响功能的情况下可以简写为x++;

二、 变量名方法名尽量在不影响语意的情况下简单。(可以选择首字母命名)

eg:定义数组的长度可以取名为:ArrLen而不需要取为ArrayLength。

三、 关于JS的循环,循环是一种常用的流程控制。

JS提供了三种循环:for(;;)、while()、for(in)。在这三种循环中for(in)的效率最差,因为它需要查询Hash键,因此应尽量少用for(in)循环,for(;;)、while()循环的性能基本持平。当然,推荐使用for循环,如果循环变量递增或递减,不要单独对循环变量赋值,而应该使用嵌套的++或?运算符。

四、 如果需要遍历数组,应该先缓存数组长度,将数组长度放入局部变量中,避免多次查询数组长度。

因为我们常常要根据字符串、数组的长度进行循环,而通常这个长度是不变的,比如每次查询a.length,就要额外进行一个操作,而预先把var len=a.length,则就少了一次查询。

五、 尽量选用局部变量而不是全局变量。

局部变量的访问速度要比全局变量的访问速度更快,因为全局变量其实是window对象的成员,而局部变量是放在函数的栈里的。

六、 尽量少使用eval。

每次使用eval需要消耗大量时间,这时候使用JS所支持的闭包可以实现函数模板。

七、 减少对象查找

因为JavaScript的解释性,所以a.b.c.d.e,需要进行至少4次查询操作,先检查a再检查a中的b,再检查b中的c,如此往下。所以如果这样的表达式重复出现,只要可能,应该尽量少出现这样的表达式,可以利用局部变量,把它放入一个临时的地方进行查询。

八、 字符串连接。

如果是追加字符串,最好使用s+=anotherStr操作,而不是要使用s=s+anotherStr。

如果要连接多个字符串,应该少使用+=,如s+=a;s+=b;s+=c;应该写成s+=a + b + c;
而如果是收集字符串,比如多次对同一个字符串进行+=操作的话,最好使用一个缓存。怎么用呢?使用JavaScript数组来收集,最后使用join方法连接起来,如下

var buf = new Array();for(var i = 0; i < 100; i++){ buf.push(i.toString());}var all = buf.join("");

九、 类型转换

1. 把数字转换成字符串,应用"" + 1,虽然看起来比较丑一点,但事实上这个效率是最高的,性能上来说:("" +) > String() > .toString() > new String()

尽量使用编译时就能使用的内部操作要比运行时使用的用户操作要快。

String()属于内部函数,所以速度很快,而.toString()要查询原型中的函数,所以速度逊色一些,new String()用于返回一个精确的副本。

2. 浮点数转换成整型,这个更容易出错,很多人喜欢使用parseInt(),其实parseInt()是用于将字符串转换成数字,而不是浮点数和整型之间的转换,我们应该使用Math.floor()或者Math.round()。Math是内部对象,所以Math.floor()其实并没有多少查询方法和调用的时间,速度是最快的。

3. 对于自定义的对象,如果定义了toString()方法来进行类型转换的话,推荐显式调用toString(),因为内部的操作在尝试所有可能性之后,会尝试对象的toString()方法尝试能否转化为String,所以直接调用这个方法效率会更高

十、 尽量作用JSON格式来创建对象,而不是var obj=new Object()方法。

因为前者是直接复制,而后者需要调用构造器,因而前者的性能更好。

十一、 当需要使用数组时,也尽量使用JSON格式的语法,

使用JSON格式的语法即直接使用如下语法定义数组:[parrm,param,param...],而不是采用new Array(parrm,param,param...)这种语法。因为使用JSON格式的语法是引擎直接解释的。而后者则需要调用Array的构造器。

十二、 对字符串进行循环操作,例如替换、查找,就使用正则表达式。

因为JS的循环速度比较慢,而正则表达式的操作是用C写成的API,性能比较好。

十三、 插入HTML

很多人喜欢在JavaScript中使用document.write来给页面生成内容。事实上这样的效率较低,如果需要直接插入HTML,可以找一个容器元素,比如指定一个div或者span,并设置他们的innerHTML来将自己的HTML代码插入到页面中。

十四、 对象查询

使用[“”]查询要比.items()更快

十五、 定时器

如果针对的是不断运行的代码,不应该使用setTimeout,而应该是用setInterval。setTimeout每次要重新设置一个定时器。

十六、 尽量减少DOM调用

在Web开发中,JavaScript的一个很重要的作用就是对DOM进行操作。可是对DOM的操作是非常昂贵的,因为这会导致浏览器执行回流 (reflow)操作。我们应该尽可能的减少DOM操作。
回流操作主要会发生在几种情况下:
* 改变窗体大小
* 更改字体
* 添加移除stylesheet块
* 内容改变哪怕是输入框输入文字
* CSS虚类被触发如 :hover
* 更改元素的className
* 当对DOM节点执行新增或者删除操作或内容更改时。
* 动态设置一个style样式时(比如element.style.width="10px")。
* 当获取一个必须经过计算的尺寸值时,比如访问offsetWidth、clientHeight或者其他需要经过计算的CSS值
解决问题的关键,就是限制通过DOM操作所引发回流的次数:
1.在对当前DOM进行操作之前,尽可能多的做一些准备工作,保证N次创建,1次写入。
2.在对DOM操作之前,把要操作的元素,先从当前DOM结构中删除:
2.1. 通过removeChild()或者replaceChild()实现真正意义上的删除。
2.2. 设置该元素的display样式为“none”。

3.CSS部分
另外一个经常引起回流操作的情况是通过style属性对元素的外观进行修改,如element.style.backgroundColor = "blue";
每次修改元素的style属性,都肯定会触发回流操作,要解决这个问题可以:
3.1.使用更改className的方式替换style.xxx=xxx的方式。
3.2.使用style.cssText = '';一次写入样式。
3.3. 避免设置过多的行内样式
3.4. 添加的结构外元素尽量设置它们的位置为fixed或absolute
3.5. 避免使用表格来布局
3.6. 避免在CSS中使用JavaScript expressions(IE only)
4.将获取的DOM数据缓存起来。这种方法,对获取那些会触发回流操作的属性(比如offsetWidth等)尤为重要。
5.当对HTMLCollection对象进行操作时,应该将访问的次数尽可能的降至最低,最简单的,你可以将length属性缓存在一个本地变量中,这样就能大幅度的提高循环的效率。

十七、 重构<script>和<style> 调用方式或合并js文件来优化请求次数,并尽量使用外部链接方式引用

我们常常在一个HTML文件头中看到这样标记代码:

<script src="/scripts/a.js"></script>

<script src="/scripts/b.js"></script>

<script src="/scripts/c.js"></script>

大多是情况下,上述代码可以被简化成:

<script src="/ scripts /d.js"></script>

其中d.js中引用了a.js/b.js/c.js。通过document.write方法写入。

十八、 对于大的JS对象,因为创建时时间和空间的开销都比较大,因此应该尽量考虑采用缓存。

十九、 将脚本放到底部。

脚本一般是用来于用户交互的,建议可以等页面加载完成之后再加载js文件。所以,脚本和CSS正好相反,脚本应该放在页面的底部。

二十、 除去JavaScript中的空白区域

可以用相关工具去除空白注释等,将所有的名称都重新用一个或两个字母来命名将带来显著的改善。(但需要留有一个未验收的备份文件,方便以后维护)

Javascript 相关文章推荐
javascript hashtable实现代码
Oct 13 Javascript
window.open 以post方式传递参数示例代码
Feb 27 Javascript
JavaScript学习笔记之内置对象
Jan 22 Javascript
text-align:justify实现文本两端对齐 兼容IE
Aug 19 Javascript
JavaScript基础之流程控制语句的用法
Aug 31 Javascript
vue 数组和对象不能直接赋值情况和解决方法(推荐)
Oct 25 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
Oct 20 Javascript
webpack 代码分离优化快速指北
May 18 Javascript
JavaScript 处理树数据结构的方法示例
Jun 16 Javascript
JS运算符简单用法示例
Jan 19 Javascript
详解React 元素渲染
Jul 07 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
Oct 28 Javascript
JS检测图片大小的实例
Aug 21 #Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
Aug 21 #Javascript
JavaScript 中的日期和时间及表示标准介绍
Aug 21 #Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
Aug 21 #Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
Aug 21 #Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
Aug 21 #Javascript
jquery.qrcode在线生成二维码使用示例
Aug 21 #Javascript
You might like
PHP+AJAX实现无刷新注册(带用户名实时检测)
2006/12/02 PHP
php生成SessionID和图片校验码的思路和实现代码
2009/03/10 PHP
定义php常量的详解
2013/06/09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
PHP 生成微信红包代码简单
2016/03/25 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
JS控制网页动态生成任意行列数表格的方法
2015/03/09 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
利用js来实现缩略语列表、文献来源链接和快捷键列表
2016/12/16 Javascript
React Native 使用Fetch发送网络请求的示例代码
2017/12/02 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
微信小程序使用map组件实现路线规划功能示例
2019/01/22 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
2014/06/04 Python
python里大整数相乘相关技巧指南
2014/09/12 Python
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
如何利用python给图片添加半透明水印
2019/09/06 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
电子商务专业推荐信范文
2013/12/02 职场文书
汽车维修专业个人求职信范文
2014/01/01 职场文书
高中军训的心得体会
2014/09/01 职场文书
寒假生活随笔
2015/08/15 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
el-table-column 内容不自动换行的解决方法
2022/08/14 Vue.js