高性能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简单体验
Jan 10 Javascript
用正则表达式替换图片地址img标签
Nov 22 Javascript
js密码强度校验
Nov 10 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
May 27 Javascript
Angular的事件和表单详解
Dec 26 Javascript
webpack 3.X学习之多页面打包的方法
Sep 04 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
Oct 20 Javascript
微信小程序实现拍照画布指定区域生成图片
Jul 18 Javascript
Vue基础配置讲解
Nov 29 Javascript
小程序如何写动态标签的实现方法
Feb 05 Javascript
ES6函数和数组用法实例分析
May 23 Javascript
Vue3 响应式侦听与计算的实现
Nov 11 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
php实现mysql数据库备份类
2008/03/20 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
2020/03/20 PHP
PHP基于数组实现的分页函数实例
2014/08/20 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
js调试系列 初识控制台
2014/06/18 Javascript
浅谈javascript中自定义模版
2015/01/29 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
Python编程实现正则删除命令功能
2017/08/30 Python
python脚本实现验证码识别
2018/06/07 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
Python 保持登录状态进行接口测试的方法示例
2019/08/06 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
Python OpenCV视频截取并保存实现代码
2019/11/30 Python
在 Python 中接管键盘中断信号的实现方法
2020/02/04 Python
Python气泡提示与标签的实现
2020/04/01 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
2021/01/28 Python
奥兰多迪士尼门票折扣:Undercover Tourist
2018/07/09 全球购物
拉斯维加斯城市观光通行证:Las Vegas Pass
2019/05/21 全球购物
创业资金计划书
2014/02/06 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
Pytest中conftest.py的用法
2021/06/27 Python
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers