编写高效的Javascript ------ Nicholas C. Zakas
Nicholas C. Zakas 在《编写高效的Javascript》一文里总结如下:
管理作用域非常重要,因为存取非局部变量要比局部变量耗时更多。尽量避免使用增长作用域链的结构,比如使用with语句和try-catch从句。如果非局部变量的使用超过一次,那么为了降低性能损耗,就应该将它存储到一个局部变量中。
存储和读取数据的方式对脚本性能影响极大。字面量和局部变量总是最快的;存取数组元素和对象属性会引起性能损耗。如果数组元素或者对象属性的使用超过一次,那么,为了提高存取速度,就应该将它存储到一个局部变量中。
流控制也是影响脚本执行速度的一个重要因素。条件判断有三种方式:if语句、switch语句和数组查找。if语句适用于少量离散值或者一段区间值的判断;switch语句最好用于对3~10个离散值的判断;数组查找在处理大量离散值时效率最高。
在Javascript中,循环经常会成为性能瓶颈。为了使循环效率更高效,可以采用倒序的方式来处理元素,也就是在控制条件中,将迭代变量和0做比较。相比非0值,这种方式要快得多,从而显著提升数组的处理速度。如果必须要进行大量的迭代,还可以考虑使用Duff策略来提高执行速度。
谨慎使用HTMLCollection对象。每次存取这类对象的属性,都会重新查询DOM中匹配的节点。为了避免这种高昂的开销,只有在必要时才存取HTMLCollection对象,并将经常存取的值(例如length属性)存储在局部变量中。
常见的字符串操作可能带来意料之外的性能问题。Internet Explorer处理字符串连接的速度比其他浏览器要慢得多,但这没什么大不了,除非你执行1000次以上的字符串连接。你可以对Internet Explorer处理字符串连接的方式进行优化:先将所有要连接的字符串存储到数组中,然后调用join()方法合并他们。去除字符串两端的空白也可能很耗时,这取决于字符串的大小。如果脚本中经常需要去除字符串两端的空白,那请确保使用最优算法。
浏览器会限制Javascript可以运行的最长时间,有些会以执行语句的数量作为判断条件,有些则会控制Javascript引擎执行的总时间。你可以使用定时器将任务拆分执行,从而绕开这些限制,避免浏览器弹出中止脚本运行的警告。