JavaScript数据存取的性能问题
JavaScript中四种基本的数据存取位置:
字面量:只代表自身 字符串、数字、布尔值、对象、函数、数组、正则,以及null和undefined 快
本地变量:var定义的 快
数组元素:以数字作为索引 慢
对象成员:以字符串作为索引 慢
大多数情况下,从字面量和一个局部变量中存取数据的性能差异不大,而访问数组元素和对象成员的代价略高(根据地址查找堆)
一、作用域链和标识符解析
函数内部属性[[scope]]包含了被创建时所在作用域中的对象的集合,称为函数的作用域链
function add(num1, num2){
var sum = num1 + num2;
return sum;
}
若add是在全局环境下创建,那它的作用域链,就只有一个全局对象(this:window, window:object, document:object, add:function)
var total = add(5, 10);
当add执行时,其执行环境的作用域链为 活动对象(this:window, arguments:[5, 10], num1:5, num2: 10, sum:undefined) + 上面的全局对象
标识符解析时,查找执行环境作用域链,找到即停。标识符所在的位置越深,读写速度就越慢。全局变量总是在执行环境作用域链的最末端,因此它也是最远的
如果每个某个跨作用域的值在函数中被引用了一次以上,建议把它存储到局部变量。如下:
var bd = document.body,
links = document.getElementsByTagName('a'),
goBtn = document.getElementById('go-btn');
document是个全局变量,仅仅声明变量就被访问了这么多次,但每一次访问document都要遍历整个作用域链,直到最后在全局变量对象中找到,开销很大,建议用局部变量存储:
var doc = document,
bd = doc.body,
links = doc.getElementsByTagName('a'),
goBtn = doc.getElementById('go-btn');
二、对象成员和原型链
对象中有两种成员类型:实例成员 和 原型成员。实例成员直接存在于对象实例中,原型成员则从对象原型中继承而来。
var obj = {},
var arr = [];
function fun(){
//do something
}
obj的原型链:obj ---> Object.prototype
arr的原型链:arr ---> Array.prototype --->Object.prototype
fun的原型链:fun ---> Function.prototype ---> Object.prototype
所有对象都是Object的实例,所以都会继承Object.prototype中的方法,如:hasOwnProperty、isPropertyOf、toString
arr调用toString时,要一级一级搜索原型链,直到Object.prototype。可见存在的位置越深,寻找就越慢。
搜索对象成员本身就比 从字面量或局部变量中读取数据 代价高,再加上遍历原型链,更慢。
若要多次读取同一个对象属性,最佳做法是将属性值保存到局部变量中,避免多次查找带来的性能开销。
JavaScript数据存取的性能问题的更多相关文章
- 高性能JavaScript(数据存取)
数据存取分为4各部分 存取位置 作用域及改变作用域 原型以及原型链 缓存对象成员值 存取位置 JavaScript 有4中基本的数据存取位置 字面量:字面量代表自身,不存于特定的位置.比如这个的匿名函 ...
- JS性能优化——数据存取
首先,了解几个概念: 字面量:它只代表自身,不存储在特定的位置.JavaScript中的字面量有:字符串.数字.布尔值.对象.数组.函数.正则,以及特殊的null和undefined值 本地变量:使用 ...
- 高性能JS笔记2——数据存取
数据存取性能而言: 字面量>本地变量>数组元素>对象成员 一.标识符解析的性能 标识符解析是有代价的,一个标识符的位置越深,它的读写速度也就越慢. 局部变量的读写速度是最快的,全局变 ...
- 高性能Js—数据存取
数据存取 JavaScript中四中基本的数据存取位置 字面量:不存于某个变量内 本地变量:var定义的 数组元素 对象成员 字面量.全局变量读取速度 > 数组项.对象成员 .因为局部变量存在于 ...
- Laxcus大数据管理系统2.0(5)- 第三章 数据存取
第三章 数据存取 当前的很多大数据处理工作,一次计算产生几十个GB.或者几十个TB的数据已是正常现象,驱动数百.数千.甚至上万个计算机节点并行运行也已经不足为奇.但是在数据处理的后面,对于这种在网络间 ...
- 【HANA系列】SAP HANA XS使用JavaScript数据交互详解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Jav ...
- JavaScript 数据访问(通译自High Performance Javascript 第二章) [转]
JavaScript 数据访问(通译自High Performance Javascript 第二章) JavaScript 数据访问(翻译自High Performance Javascript ...
- 【HANA系列】【第一篇】SAP HANA XS使用JavaScript数据交互详解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列][第一篇]SAP HANA XS ...
- 13 个最佳 JavaScript 数据网格库
13 个最佳 JavaScript 数据网格库 转自:开源中国 www.oschina.net/translate/best-javascript-data-grid-libraries Java ...
随机推荐
- armv7 armv7s arm64
arm处理器以其低功耗和小尺寸而闻名,几乎所有的手机处理器都是基于arm,在嵌入式系统中应用非常广泛. armv6, armv7, armv7s, arm64指的是arm处理器的指令集. i386 ...
- Android开发案例 - 自定义虚拟键盘
所有包含IM功能的App(如微信, 微博, QQ, 支付宝等)都提供了Emoji表情之类的虚拟键盘, 如下图: 本文只着重介绍如何实现输入法键盘和自定义虚拟键盘的流畅切换, 而不介绍如何实现虚 ...
- NFR
你NFR了吗? NFR,即非功能性需求 (Non -Functional Requirements) ,即系统能够完成所期望的工作的性能与质量.具体包括如下内容: – 效率: 软件实现其功能所需要的计 ...
- gulp rev manifest 添加目录前缀
gulp-rev 生成的manifest默认为: "index.css": "index.css?v=04aff97a7b", 为避免同名文件覆盖版本号,对替换 ...
- 原创 C++应用程序在Windows下的编译、链接(四)动态链接
4动态链接 4.1概述 在静态链接阶段,链接器为PE文件生成了导入表,导出表,符号表,并调整了Call指令后面的操作数,在程序调用的时候,能够直接地或者间接地定位到IAT中的某个位置,在PE文件中,该 ...
- Ubuntu 14 Trusty安装hue
想开始学习一下hive,需要一个使用起来方便的客户端,网上搜了一下发现hue是个很常用的工具.于是,就在自己的ubuntu14系统里,尝试安装hue.下面就是自己的安装步骤,记录如下: 1.先查看自己 ...
- NFS网络共享服务部署
10.3 NFS服务端部署环境准备 10.3.1 NFS服务部署服务器准备 服务器系统 角色 IP Centos6.7 x86_64 NFS服务器端(NFS-server) 192.168.1.14 ...
- centos6 系统安装 system-config-kickstart 工具
kickstart 能实现 linux 系统的自动化安装,需要设置 ks.cfg 文件,而这个 ks.cfg 文件的生成最好使用 system-config-kickstart 工具生成,比较准确,也 ...
- 腾讯php经历
12年毕业至今,一年C#,2年php,几个月node,因为一些原因再次离职,接到腾讯互娱的php面试电话,匆匆准备了一番,便去了科兴科技园腾讯的高大上办公楼. 1.笔试 试题大部分网上都有,例如: 用 ...
- Unity 重要基础知识点
这是两个月前的学习记录,发出来了下,如果有误欢迎大家指出: 脚本生命周期 //每当脚本被加载时调用一次 // 1. 在Awake中做一些初始化操作 void Awake(){ //初始化publi ...