是“. . in"Javascript中的循环总是不好的

Are "for...in" loops in Javascript always bad?

本文关键字:循环 Javascript in quot      更新时间:2023-09-26

我有一个情况,我试图使工作与array,但我只是不认为它会。我希望有一个对象列表,每个对象都有一个唯一的ID,并且我希望能够轻松地引用特定对象,而不必在数组中循环搜索该ID。

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

我的问题是:

人们扩展Object.prototype真的那么普遍,我应该厌倦使用它吗?还有其他原因,为什么我不想使用for...in循环?

另一方面,在数组中循环查找唯一ID的性能影响是否如此之小,以至于我不应该担心?

(为了记录,数组中可能有相当少的元素,但我将非常频繁地访问它。此外,我写的代码将是一个jQuery插件,所以我无法控制其他糟糕的代码与它结合在一起。

更新:

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

基本上,尽管对象方式略快,但差异可以忽略不计。不过,使用for...inhasOwnProperty似乎更简洁。

即使有人扩展了原型,您也可以使用hasOwnProperty属性来排除这些成员。这正是Sugar.js推荐的:

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

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

我的问题是:

人们扩展Object真的那么普遍吗?我应该厌倦使用它的原型吗?还有其他原因为什么我不想用a来表示…在循环?

不,这并不常见,但确实发生过。无论如何,您应该使用for..in循环,但使用.hasOwnProperty(),如其他答案所示。

我想不出有什么理由在对象上使用for..in;显然你不能在数组上使用它)。

另一方面,在数组中循环查找唯一ID的性能影响是否如此之小,以至于我不应该担心?

你提到你的数组不会有很多元素,但我仍然认为,即使它执行得很好,它也会不必要地使你的代码复杂化,因为你根本不必为对象这样做。另一方面,使用.hasOwnProperty()是一个较小的复杂性,它有效地成为每个for..in.

语法的一部分。

您可以在这里设置性能测试:http://jsperf.com/

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

或者你可以保留你自己的"键"列表分配给给定的对象