Javascript对象成员访问权限

时间:2010-09-02 20:50:42

标签: javascript performance browser

我想知道对象成员的访问时间。更确切地说,我正在对window对象的访问时间进行基准测试。我相信我可以自己解释大部分行为,但听到一些评论我会感觉更好。

用例:不同属性的访问时间不同?

我在Firefox 3.6.8(windows)上进行基准测试,简单的测量代码如下所示:

var loop = 100000;

console.time('bench');
while(loop--){
   if(window.JSON)
      var foo = 0;
}
console.timeEnd('bench');

第一个奇怪的是,它使我正在查找的属性与众不同。例如,window.JSON似乎比window.localStorage访问速度更快。还有其他属性/方法可以更快地访问 由于ECMA-262 Language Specification中没有规范或定义,对象中的顺序键必须具有,我猜每个浏览器供应商都会实现它自己的逻辑,其中keys顺序存储在内存中。 /> 这可能是对这种行为的解释吗?比如,JSON是最早的密钥之一,location最后是更多的密钥? (至少在我的测试环境中)

-

我注意到的另一件事是,调用if(JSON)略快于if(window.JSON)。如果我们忘记了你因为可能的引用错误而总是应该进行第二次调用,那些调用应该具有相同的访问时间。我知道nested member lookups上的ECMA脚本行为(嵌套成员将导致Javascript引擎通过对象成员解析,每次遇到点),所以{{1} }必须慢于window.location.href,但在这种情况下...... location.hrefJSON之间有区别吗?

要结束此操作,了解window.JSON对象是否拥有特定属性/方法的最快方法是使用window运算符。对于上述示例,这大约快10倍。

1 个答案:

答案 0 :(得分:3)

您注意到的第一个奇怪的事情可能与浏览器如何实现host objects有关。

localStorage主机对象,由环境提供,另一方面,JSON是由ECMAScript提供的built-in object

尝试解析其他内置内容,与JSON相比,您获得的结果大致相同。

现在,关于JSONwindow.JSON的区别:

window只是全局对象上指向自身的属性,当您访问window标识符时,会发生名称解析过程以找到它。

基本上引用:

JSON;

仅涉及一个标识符查找(在范围链中),并且:

window.JSON;

涉及标识符查找(window)和属性查找(window.JSON)。