高性能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 相关文章推荐
JavaScript 异步调用框架 (Part 5 - 链式实现)
Aug 04 Javascript
基于编写jQuery的无缝滚动插件
Aug 02 Javascript
使用text方法获取Html元素文本信息示例
Sep 01 Javascript
修复bash漏洞的shell脚本分享
Dec 31 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
Mar 24 Javascript
ArtEditor富文本编辑器增加表单提交功能
Apr 18 Javascript
jQuery Validate设置onkeyup验证的实例代码
Dec 09 Javascript
原生node.js案例--前后台交互
Feb 20 Javascript
通过js修改input、select默认字体颜色
Apr 19 Javascript
js获取地址栏参数的两种方法
Jun 27 Javascript
详解开源的JavaScript插件化框架MinimaJS
Oct 26 Javascript
Vue.js的动态组件模板的实现
Nov 26 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
substr()函数中文版
2006/10/09 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
手挽手带你学React之React-router4.x的使用
2019/02/14 Javascript
VUE安装使用教程详解
2019/06/03 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
vue 实现单选框设置默认选中值
2019/11/07 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python实现的防DDoS脚本
2011/02/08 Python
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
Python探索之URL Dispatcher实例详解
2017/10/28 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
Python计算机视觉里的IOU计算实例
2020/01/17 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
全球独特生活方式产品和礼品购物网站:AHAlife
2018/09/18 全球购物
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
毕业自我鉴定
2013/11/05 职场文书
环境工程毕业生自荐信
2013/11/17 职场文书
策划创业计划书
2014/02/06 职场文书
云冈石窟导游词
2015/02/04 职场文书
话题作文之学会尊重
2019/12/16 职场文书
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
2022/04/09 Javascript