Javascript 检查对象的键是否比在数组中搜索字符串更有效?

Javascript 检查对象的键是否比在数组中搜索字符串更有效?,javascript,jquery,arrays,Javascript,Jquery,Arrays,我正在创建一个数据结构,其中包含我将用来反复检查是否定义了某些值的数据。我提出了两种可能的解决方案,我想知道哪一种更有效,或者是否有更好的方法: 1) 使用数组:keys=['key1','key2','key3'] 我可以创建这样的数组,然后使用jQuery.inArray(keyToCheck,keys)>-1检查并查看keyToCheck是否在我的数组中 2) 使用对象:keys={key1:1,key2:1,key3:1} 我可以创建此对象,然后使用keys[keyToCheck]| |

我正在创建一个数据结构,其中包含我将用来反复检查是否定义了某些值的数据。我提出了两种可能的解决方案,我想知道哪一种更有效,或者是否有更好的方法:

1) 使用数组:
keys=['key1','key2','key3']

我可以创建这样的数组,然后使用
jQuery.inArray(keyToCheck,keys)>-1
检查并查看
keyToCheck
是否在我的数组中

2) 使用对象:
keys={key1:1,key2:1,key3:1}

我可以创建此对象,然后使用
keys[keyToCheck]| | 0
查看是否定义了
keyToCheck


我不确定的是搜索对象是如何在javascript中实现的,以及它是否比通过数组循环的
jQuery.inArray
更有效。这些方法之间是否存在性能差异?使用jQuery对我来说不是问题,因为出于其他原因,我的代码中已经有了它。

当想知道性能时,一种获得答案的方法是在jsperf上测试几个案例。
(可能还有其他我不知道的基准网站,如果你知道另一个,请发表评论,我不想做广告)

对于您的案例,我测试了3种方法:
-在数组中使用indexOf
-使用“in”运算符
-测试对象的属性值

psperf在这里提供了大约10个项目:

我们可以看到,在Firefox上使用对象的属性值要快得多(比array快20倍以上,比in快5倍以上)。
在Safari上,一切都比Firefox慢,但对象属性访问速度要快两倍多。
但在Chrome上,我不明白发生了什么:所有3种方法都非常接近,但最快的是array/indexOf方法

表演往往令人惊讶

请注意,结果可能会发生变化,甚至会发生显著变化,这取决于关键点的数量(5、20、5000?),也取决于选中的关键点在集合中的概率

我想知道一个500长度的密钥数组会发生什么变化。结果如下:

我们看到数组因“大”键计数而失败。
所以你必须弄清楚你的处境。
只需少量的密钥计数,处理属性的开销就可以使数组获胜。

对于较大的键计数,在数组中迭代的代价使属性获胜…

如前所述,对象查找至少应该是线性的。在数组中,您搜索任何键的值,在对象中,您搜索特定键并忽略该值。如果您在数组中查找特定键,而不是在对象中查找特定键,这将是一个更接近的比较。对于投票结束此问题的人来说,主要基于观点,一种方法是否比另一种方法更有效是一个观点问题,而不是猜测。inArray()非常慢,对象查找非常快,在V8中几乎瞬间。。。关于线性这个或那个的理论内容与用户的土地循环与单一的本地属性查找相比根本不算什么。JIT无论如何都欺骗了C++的大多数基准。如果希望代码快速,请使用查找表而不是数组。