javascript对象属性查找

时间:2011-05-06 21:05:40

标签: javascript performance

由于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()

或更多?

感谢。

3 个答案:

答案 0 :(得分:3)

我想你想要的第一个:

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

然后你可以谈论速度差异和不同的行为。

作业:

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

答案 1 :(得分:3)

这可以凭经验测试:

<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中以及更多方法中。

答案 2 :(得分:2)

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

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

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

所以,如果对象有很多属性,那么方法1总是更快,更多更快。

正如旁注:许多现代JavaScript引擎(即Google的V8)可能会为您优化代码以提供更好的性能。事实上,我相信V8中的Objects被实现为真正的类。在这种情况下,与传统的哈希表查找不同,内存查找保证是恒定时间。