高性能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 相关文章推荐
ExtJS 2.0实用简明教程 之Border区域布局
Apr 29 Javascript
判断用户是否在线的代码
Mar 05 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
Jan 23 Javascript
JQuery each打印JS对象的方法
Nov 13 Javascript
js中arguments,caller,callee,apply的用法小结
Jan 28 Javascript
理解javascript中的回调函数(callback)
Sep 02 Javascript
jQuery搜索子元素的方法
Feb 10 Javascript
JavaScript实现重置表单(reset)的方法
Apr 02 Javascript
Webpack执行命令参数详解
Jun 17 Javascript
JavaScript在控件上添加倒计时功能的实现代码
Jul 04 Javascript
js实现带进度条提示的多视频上传功能
Dec 13 Javascript
微信小程序本地存储实现每日签到、连续签到功能
Oct 09 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
晶体管来复再生式二管收音机
2021/03/02 无线电
用cookies来跟踪识别用户
2006/10/09 PHP
php-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
Highcharts+NodeJS搭建数据可视化平台示例
2017/01/01 NodeJs
微信小程序 开发经验整理
2017/02/15 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
2019/08/03 Javascript
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
python代码编写计算器小程序
2020/03/30 Python
Django组件content-type使用方法详解
2019/07/19 Python
django 消息框架 message使用详解
2019/07/22 Python
Python实现直播推流效果
2019/11/26 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
游戏商店:Eneba
2020/04/25 全球购物
普通PHP程序员笔试题
2016/01/01 面试题
幼儿园教师教学反思
2014/02/06 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
校园演讲稿汇总
2014/05/21 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
房屋租赁合同解除协议书
2014/10/11 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
2019年公司卫生管理制度样本
2019/08/21 职场文书