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数据存取的性能问题的更多相关文章

  1. 高性能JavaScript(数据存取)

    数据存取分为4各部分 存取位置 作用域及改变作用域 原型以及原型链 缓存对象成员值 存取位置 JavaScript 有4中基本的数据存取位置 字面量:字面量代表自身,不存于特定的位置.比如这个的匿名函 ...

  2. JS性能优化——数据存取

    首先,了解几个概念: 字面量:它只代表自身,不存储在特定的位置.JavaScript中的字面量有:字符串.数字.布尔值.对象.数组.函数.正则,以及特殊的null和undefined值 本地变量:使用 ...

  3. 高性能JS笔记2——数据存取

    数据存取性能而言: 字面量>本地变量>数组元素>对象成员 一.标识符解析的性能 标识符解析是有代价的,一个标识符的位置越深,它的读写速度也就越慢. 局部变量的读写速度是最快的,全局变 ...

  4. 高性能Js—数据存取

    数据存取 JavaScript中四中基本的数据存取位置 字面量:不存于某个变量内 本地变量:var定义的 数组元素 对象成员 字面量.全局变量读取速度 > 数组项.对象成员 .因为局部变量存在于 ...

  5. Laxcus大数据管理系统2.0(5)- 第三章 数据存取

    第三章 数据存取 当前的很多大数据处理工作,一次计算产生几十个GB.或者几十个TB的数据已是正常现象,驱动数百.数千.甚至上万个计算机节点并行运行也已经不足为奇.但是在数据处理的后面,对于这种在网络间 ...

  6. 【HANA系列】SAP HANA XS使用JavaScript数据交互详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Jav ...

  7. JavaScript 数据访问(通译自High Performance Javascript 第二章) [转]

    JavaScript 数据访问(通译自High Performance Javascript 第二章)   JavaScript 数据访问(翻译自High Performance Javascript ...

  8. 【HANA系列】【第一篇】SAP HANA XS使用JavaScript数据交互详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列][第一篇]SAP HANA XS ...

  9. 13 个最佳 JavaScript 数据网格库

    13 个最佳 JavaScript 数据网格库   转自:开源中国 www.oschina.net/translate/best-javascript-data-grid-libraries Java ...

随机推荐

  1. [Erlang 0110] Erlang Abstract Format , Part 1

    Erlang Abstract Format并不难懂,只是枯燥一点罢了,如果把Abstract Format的文档翻译出来,其实就是Erlang教科书中语法入门的部分. Erlang Abstract ...

  2. 关于web端功能测试的测试方向

    一.功能测试 1.1链接测试 链接是web应用系统的一个很重要的特征,主要是用于页面之间切换跳转,指导用户去一些不知道地址的页面的主要手段,链接测试一般关注三点: 1)链接是否按照既定指示那样,确实链 ...

  3. RemodelanyWhere11.0.2673版本下载

    百度云盘链接:http://pan.baidu.com/s/1geL5lez 密码:hisq 原文转载至:http://blog.sun0816.com/13623.html

  4. Python写各大聊天系统的屏蔽脏话功能原理

    Python写各大聊天系统的屏蔽脏话功能原理 突然想到一个视频里面弹幕被和谐的一满屏的*号觉得很有趣,然后就想用python来试试写写看,结果还真玩出了点效果,思路是首先你得有一个脏话存放的仓库好到时 ...

  5. Bootstrap 快速人门案例——前端最火的插件

    今天,我给小白们分享一下比较流行的Bootstrap框架,它在工作中得到许多公司的青睐,因此对于升职和加薪很重要.同时,我们可以快速完成开发任务,减少发开周期,有不对的地方望大家指正. 如果你想走的更 ...

  6. webform开发基础

    ASP.NET WebForm C/S(Client/Server):客户端服务器 B/S(Browser/Server):浏览器服务器 C/S和B/S的区别: 首先必须强调的是C/S和B/S并没有本 ...

  7. FastCgi与PHP-fpm关系

    1 CGI  (1)什么是CGI: CGI(Common Gateway Interface)公共网关接口, 是WWW技术中最重要的技术之一,有着不可替代的重要地位, CGI是外部应用程序(CGI程序 ...

  8. [LeetCode] Course Schedule II 课程清单之二

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  9. C#将WebBowser控件替换为Chrome内核

    摘要 由于最近要做一个浏览器式的软件,其中有不少地方需要使用到jQuery和BootStrap,但是在C#中,默认的WebBrowser控件默认使用的是IE的core,而低版本的IE在JS加载上总是容 ...

  10. 网站收集ing....

    1.账号注册网址 http://bugmenot.com/ PS:只要输入相关网站域名就能立即完成网站注册 2.博客网站 CSDN,博客园,开源中国 3.破解网站 吾爱破解 4.矢量图标 http:/ ...