js数据访问的艺术
数据访问js无时不刻所要做的事情,提高对数据的访问效率对一般的小的程序来说,对性能并不会有明显的改善。但是对像淘宝这样项目巨大,访问量巨大的网站来说,一个数据访问效率的提高对性能来说可能产生很大提升。
js中有四种基本的数据访问位置。直接量,变量,数组项,对象。 对直接量和局部变量的访问成本是比较低的,而对数组和对象的访问成本稍大一些,当然不同的浏览器对这四种方式的访问差异也是不一样的,下图对这四种数据类型进行200'000 次操作所用的时间。
从上图可以看出,对直接量和局部变量的访问成本比另外两种要低很多,所以应该尽量使用直接量或局部变量。
一般来说,js中会将所有的变量保存在一条作用域链上,当需要访问一个数据时,它会从离它最近的作用域找,如果找到就停止,没找到就会一直沿着作用域链找先去,全局变量是位于作用域链的最底部。所以访问全局变量的成本是相当高的,特别是在深层函数中访问全局变量,因此要避免访问全局变量。
说到作用域链,就不得不提起js中可以临时改变上下文的作用域的两个表达式,一个是with,另一个是try catch。
with 表达式为所有对象属性创建一个默认操作变量,在其他语言中,类似的功能通常用来避免书写一些重复的代码。但是这种方式会造成很多问题,不建议使用,而且在Ecmscript5中的严格模式下,with已经不能使用。在JavaScript 中不只是with 表达式人为地改变运行期上下文的作用域链,try-catch 表达式的catch 子句具有相同效果。当try 块发生错误时,程序流程自动转入catch 块,并将异常对象推入作用域链前端的一个可变对象中。但是请注意,只要catch 子句执行完毕,作用域链就会返回到原来的状态。
另外一种对性能可能产生影响的方式就是使用闭包。闭包在js中可以说是个神奇的东西,它会对解决问题提供很好的帮助,但是对性能和内存都有很大影响。所以要慎用闭包。