代码之家  ›  专栏  ›  技术社区  ›  jAndy

JavaScripts对象成员访问

  •  1
  • jAndy  · 技术社区  · 14 年前

    我想知道对象成员的访问时间。更准确地说,我是在 window 对象。我相信我可以自己解释这里的大多数行为,但我最好听到一些评论。

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

    我正在测试火狐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 ( 每次遇到点时,嵌套成员都会导致javascript引擎通过对象成员解析。 如此 window.location.href 必须慢于 location.href 但是在这种情况下……两者之间有区别吗 杰森 温德森 ?

    为了结束这一切,最快的方法是知道 窗口 对象拥有特定的属性/方法是使用 IN 操作员。对于上面的例子,这大约快10倍。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Christian C. Salvadó    14 年前

    你注意到的第一件奇怪的事情可能是 host objects 由浏览器实现。

    localStorage 是一个 宿主对象 由环境提供, JSON 另一方面,是 built-in object 由EcmaScript提供。

    尝试解决另一个内置的,您将获得与相同的结果 杰森 .

    现在,区别在于 杰森 VS window.JSON :

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

    基本参考:

    JSON;
    

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

    window.JSON;
    

    涉及标识符查找( 窗口 )和财产查询( 温德森 )