Javascript中的“for ... in”循环总是坏的吗?

时间:2011-12-28 03:00:09

标签: javascript jquery jquery-plugins

我有一种情况,我正在尝试使用array,但我认为不会。我希望有一个对象列表,每个对象都有一个唯一的ID,我希望能够轻松地引用一个特定的对象,而无需遍历搜索该ID的数组。

如果我使用object,我可以轻松地使用唯一ID作为键,将对象作为值。但是,如果我使用对象而不是数组,我将不得不使用for...in循环,并且我知道如果使用我的代码的人扩展了Object.prototype,则存在问题。

所以这是我的问题:

人们延伸Object.prototype我是否应该厌倦使用它?还有其他原因导致我不想使用for...in循环吗?

另一方面,循环遍历数组寻找唯一ID的性能是否最小,我不应该担心?

(对于记录,数组中可能只有相当少的元素,但我会非常频繁地访问它。而且,我正在编写的代码将是一个jQuery插件,所以我无法控制什么其他不好的代码人们将它与它结合起来。)

更新

根据@nnnnnn的建议,我设置了一个jsperf测试,结果如下: http://jsperf.com/accessing-object-properties-vs-iterating-over-arrays

基本上,尽管对象方式稍快,但差异可以忽略不计。尽管如此,将for...inhasOwnProperty一起使用似乎更清晰。

3 个答案:

答案 0 :(得分:5)

即使某人确实扩展了原型,您也可以使用hasOwnProperty属性来排除这些成员。 This is exactly what Sugar.js recommends

var s = 'cat', key;
for(key in s) {
  if(s.hasOwnProperty(key)) {
    console.log(key);
  }
}

现在根据Sugar,for..in是对象文字的接受循环,但你也可以使用像$.each这样的迭代器用于jQuery,或者_.each用于Underscore.js。

答案 1 :(得分:2)

您可以在for..in循环中使用hasOwnProperty方法,以便将原型链中的内容与分配给您对象的内容区分开来。

或者您可以将自己的“键”列表分配给给定对象。

答案 2 :(得分:2)

  

所以这是我的问题:

     

人们扩展Object.prototype是否真的很常见,我应该厌倦使用它?还有其他原因我不想使用for ... in循环吗?

不,这不常见,但确实发生了。你应该使用for..in循环,但是.hasOwnProperty()如其他答案所示。

我想不出使用for..in的任何理由(在一个对象上;显然你不在数组上使用它)。

  

另一方面,循环遍历数组寻找唯一ID的性能是否最小,我不应该担心?

你提到你的数组不会有很多元素,但我认为即使它表现良好,它也会不必要地使代码复杂化,因为你根本不需要为对象做这些。另一方面,使用.hasOwnProperty()是一个小的并发症,有效地成为每个for..in的语法的一部分。

您可以在此处设置效果测试:http://jsperf.com/