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()更快,但我不完全确定。 有没有人更多地了解这两种方法之间的性能差异? 或者,这里有一个我不知道的更有效的替代方案吗?
嗯,如果集合是一个数组,你也可以使用原生indexOf,不是吗? https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
数组方法较慢,因为它需要线性时间来查找数组中的元素(代码必须逐步浏览每个元素)。 hasOwnProperty将更快,因为它可以使用哈希表查找,这在恒定时间内发生。
对象将具有非常快的属性访问时间。 但是,您仍然需要考虑计算哈希等的开销(如果实现使用哈希表来支持对象)。 如果键组相对较小,则应该没有太大差别。 如果它更大,那么我会使用object / hash来存储属性。
也就是说,用对象管理重复键会更容易,所以我个人会选择字典。
除非这是您的应用程序的瓶颈,否则您不应该过度思考它。
简答:.indexOf()(如@Claudio提到)
长答案:看看我编写的快速测试 – http://jsfiddle.net/cvallance/4YdxJ/3/ – 差异实际上可以忽略不计。