【问题标题】:javascript object property lookupjavascript 对象属性查找
【发布时间】:2011-08-20 11:52:29
【问题描述】:

由于javascript中的对象是关联映射(其他编程语言中的HashMap)做下一段代码

for (var prop in object) {
    if (prop === someConcreteProperty) {
        // some decision
        break;
    }
}

反正比虚拟属性查找慢

if (typeof object.someConcreteProperty != 'undefined') {
    // some decision
}

编辑:

我正在考虑以下代码的性能:

for ( var prop in obj)
    if (obj[prop] === someAnonymousMethod) {
        // I need that property name for my need
        return obj.prop();
    }

会不会是两倍的属性查找时间

obj.prop()

或更多?

谢谢。

【问题讨论】:

  • Programming 101: Second 更快,因为它不必遍历所有属性。

标签: javascript performance


【解决方案1】:

我猜你指的是第一个:

if ('prop' in obj) {
  // ...
}

那么你可以谈谈速度差异和不同的行为。

家庭作业:

var obj = { prop: undefined }; // a bit philosophical...

【讨论】:

    【解决方案2】:

    这可以通过经验来测试:

    <script language="javascript">
    
    alert("Initialising test object...");
    var obj = new Object();
    for (var i=0; i<1000000; i++) obj["prop"+i] = i;
    
    
    alert("Initialised. Doing Test.");
    
    var d1 = (new Date()).getTime();
    
    needle = obj["prop"+(i-1)]; // last object
    for (var prop in obj) {
        if (obj === needle) {
            // some decision
            break;
        }
    }
    
    var ms1 = ((new Date()).getTime()) - d1;
    
    alert("Method 1 took "+ms1+"ms.")
    
    var d2 = (new Date()).getTime();
    
    if (typeof obj["prop"+(i-1)] != 'undefined') {
        // some decision
    }
    
    var ms2 = (new Date()).getTime() - d2;
    alert("Method 2 took "+ms2+"ms.")
    
    </script>
    

    方法 1 比方法 2 花费的时间要长得多。这不足为奇,因为执行方法 2 所需的所有计算都包含在方法 1 中,而且还要多得多。

    【讨论】:

    • 你的测试jsperfed。第一种情况运行 2-3 次,第二种情况运行 2+ 百万次。
    • 感谢您花时间为他编写测试用例,但很难说比 cmets 中的 mVChr 更好:)
    【解决方案3】:

    当您了解属性查找在 JavaScript 中的工作原理后,这个问题的答案就变得显而易见了。在最坏的情况下,JavaScript 对象中的属性被实现为哈希表中的元素。

    在这种情况下,属性查找平均在恒定时间内执行。不过需要注意的是,在非常罕见最坏的情况下,哈希表搜索时间可能是线性的。

    如果循环遍历属性列表,则会将性能降低到线性时间,大致与对象中的属性数量成正比。

    所以,是的,方法 1 总是更快,如果对象有很多属性,则要快得多

    顺便说一句:许多现代 JavaScript 引擎(即 Google 的 V8)可能会优化您的代码以提供更好的性能。事实上,我相信 V8 中的对象是作为真正的类实现的。在这种情况下,内存查找保证为常数时间,这与传统的哈希表查找不同。

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      相关资源
      最近更新 更多