由于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()
或更多?
感谢。
答案 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被实现为真正的类。在这种情况下,与传统的哈希表查找不同,内存查找保证是恒定时间。