高性能Javascript笔记 数据的存储与访问性能优化


Posted in Javascript onAugust 02, 2012

局部变量也就可以理解为在函数内部定义的变量,很明显访问局部变量要比域外的变量要快,因为它位于作用域链的第一个变量对象中(关于作用域链的介绍可以阅读这篇文章)。变量在作用域链的位置越深,访问所需要的时间就越长,全局变量总是最慢的,因为它们位于作用域链的最后一个变量对象。

每种数据类型的访问都需要付出点性能代价,对于直接量和局部变量基本都能消费得起,而访问数组项和对象成员则要代价高点。下图显示了不同浏览器,分别对这四种数据类型进行了200'000次操作所用的时间。

高性能Javascript笔记 数据的存储与访问性能优化

由上图可以看出,要想优化代码的性能,那么尽量使用直接量和局部变量,限制数组项和对象成员的访问次数(将对象成员用一个局部变量来保存)。

首先我们需要了解一下对象成员的访问过程。其实函数就是一个特殊的对象,所以对象成员的访问跟函数的内部变量的访问都差不多,都是基于链的查找,前者是原型链,后者是作用域链,只是怎么个链法有点差别而已。

对象成员包含属性和方法,如果该成员是一个函数就称为方法,否则就称为属性。
JavaScript中的对象是基于原形(原形本身就是一个对象)的,原形是其他对象的基础。当你实例化一个Object对象或其它JS的内置对象时(var obj=new Object() or var obj={}),实例obj的原形由后台自动创建,浏览器FF,safari,Chrome可通过obj.__proto__属性(等同于 Object.prototype)可以访问到这个原形,也正是因为这个原形,每一个实例都能共享原形对象的成员。如:

var book = {  
name:"Javascript Book", 
 
getName = function(){ 

 
return this.name; 
 
} 
}; 
alert(book.toString()); //"[object Object]"

此代码中,book对象有两个私有成员,分别是属性name和方法getName。book对象并没有定义成员toString,但调用了也没有抛出错误,原因是book对象继承了原形对象的成员。book对象与原形的关系如下:

高性能Javascript笔记 数据的存储与访问性能优化

访问book对象成员toString的过程是这样的,当book.toString()被调用时,后台对成员进行名为”toString”的搜 索,首先从实例book本身开始,如果在book发现名为”toString”的成员,则搜索结束,否则继续向__proto__指向的原型对象搜索,如 果在Object的原形对象都找不到该成员,则表示该成员未定义。通过这种方式,book就可以访问它的原型对象所拥有的每个属性或方法。

对象的另一高级用法就是模拟类和继承类,我喜欢叫这样用法的对象为对象类。继承对象类主要就是依靠原型链来完成的,这个知识点太多需要另外详细 说明。通过上面的对象成员搜索过程,访问对象成员的速度,随着原型链的越深,搜索的速度就越慢。下图就显示了对象成员在原型链中所处的深度与访问时间的关 系:

高性能Javascript笔记 数据的存储与访问性能优化

由上图可清楚的知道,每深入原型链一层都会增加性能的损失,所以像那种遍历对象成员的操作开销很大。还有另外一种常用且损耗性能的做法就是嵌套对象 成员(如window.location.href),像这种最好的做法就是减少点的次数了。比如location.href就比 window.location.href快。

好了,总结起来就一句话:一个属性或方法在原型链的位置越深,访问它的速度就越慢。解决办法就是:将经常使用的对象成员,数组项和域外的变量存入局部变量中,然后访问这个局部变量。

Javascript 相关文章推荐
jQuery Ajax 全解析
Feb 08 Javascript
解析javascript 浏览器关闭事件
Jul 08 Javascript
jQuery对象初始化的传参方式
Feb 26 Javascript
jQuery中animate用法实例分析
Mar 09 Javascript
JS代码实现根据时间变换页面背景效果
Jun 16 Javascript
JS弹出新窗口被拦截的解决方法
Aug 09 Javascript
jQuery获取选中单选按钮radio的值
Dec 27 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
Feb 13 Javascript
vue 设置路由的登录权限的方法
Jul 03 Javascript
layer.open关闭父窗口 以及调用父页面的方法
Aug 17 Javascript
详解微信小程序用定时器实现倒计时效果
Apr 30 Javascript
解决vue动态下拉菜单 有数据未反应的问题
Aug 06 Javascript
基于jquery的时间段实现代码
Aug 02 #Javascript
Javascript this 的一些学习总结
Aug 02 #Javascript
创建公共调用 jQuery Ajax 带返回值
Aug 01 #Javascript
这些年、我收集的JQuery代码小结
Aug 01 #Javascript
JQquery的一些使用心得分享
Aug 01 #Javascript
javascript 兼容所有浏览器的DOM扩展功能
Aug 01 #Javascript
别了 JavaScript中的isXX系列
Aug 01 #Javascript
You might like
PR值查询 | PageRank 查询
2006/12/20 PHP
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
php与php MySQL 之间的关系
2009/07/17 PHP
php自动获取目录下的模板的代码
2010/08/08 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
Thinkphp3.2简单解决多文件上传只上传一张的问题
2017/09/26 PHP
javascript分页代码(当前页码居中)
2012/09/20 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
2015/02/27 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
2016/09/20 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
JS代码实现电脑配置检测功能
2018/03/21 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python使用xlrd读取Excel格式文件的方法
2015/03/10 Python
Python中的defaultdict与__missing__()使用介绍
2018/02/03 Python
python监控键盘输入实例代码
2018/02/09 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
python 导入数据及作图的实现
2019/12/03 Python
美国成衣女装品牌:CHICO’S
2016/09/19 全球购物
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
销售部主管岗位职责
2013/12/18 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
Element实现动态表格的示例代码
2021/08/02 Javascript