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

时间:2011-05-20 17:18:17

标签: javascript jquery performance

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

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

或数组:

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

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

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()快,但我不完全确定。有没有人更多地了解这两种方法之间的性能差异?或者,这里有一个我不了解的更有效的替代方案吗?

5 个答案:

答案 0 :(得分:6)

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

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

由于其他人所说的原因,

hasOwnProperty更快。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

除非这是您申请中的瓶颈,否则您不应该过度思考。

答案 4 :(得分:0)

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

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