jquery.inArray()与Object.hasOwnProperty()之间的性能差异?

我有一种情况,我可以选择将字符串键的集合实现为一个对象:

$.each(objects, function (key, object) { collection[key] = "doesn't matter"; }); 

或数组:

 $.each(objects, function (key, object) { collection.push(key); }); 

我希望能够快速确定集合是否包含给定的密钥。 如果collection是一个对象,我可以使用:

 if (collection.hasOwnProperty(key_to_find)) { // found it!... } else { // didn't find it... } 

如果collection是一个数组,我可以使用:

 if ($.inArray(key_to_find, collection)) { // found it!... } else { // didn't find it... } 

我想使用JavaScript的内置hasOwnProperty会比jQuery的inArray()更快,但我不完全确定。 有没有人更多地了解这两种方法之间的性能差异? 或者,这里有一个我不知道的更有效的替代方案吗?

如果我们正在谈论检查需要多长时间,那么真的没有比赛:

http://jsperf.com/array-vs-obj

由于其他人所说的原因,hasOwnProperty的速度更快。

嗯,如果集合是一个数组,你也可以使用原生indexOf,不是吗? https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf

数组方法较慢,因为它需要线性时间来查找数组中的元素(代码必须逐步浏览每个元素)。 hasOwnProperty将更快,因为它可以使用哈希表查找,这在恒定时间内发生。

对象将具有非常快的属性访问时间。 但是,您仍然需要考虑计算哈希等的开销(如果实现使用哈希表来支持对象)。 如果键组相对较小,则应该没有太大差别。 如果它更大,那么我会使用object / hash来存储属性。

也就是说,用对象管理重复键会更容易,所以我个人会选择字典。

除非这是您的应用程序的瓶颈,否则您不应该过度思考它。

简答:.indexOf()(如@Claudio提到)

长答案:看看我编写的快速测试 – http://jsfiddle.net/cvallance/4YdxJ/3/ – 差异实际上可以忽略不计。