是“. . in"Javascript中的循环总是不好的
Are "for...in" loops in Javascript always bad?
我有一个情况,我试图使工作与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...in
和hasOwnProperty
似乎更简洁。
即使有人扩展了原型,您也可以使用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
方法,以便将原型链上的内容与分配给对象的内容区分开来。
或者你可以保留你自己的"键"列表分配给给定的对象
- 控制器不会进入for循环:javascript
- 使用来自不同循环Javascript的数据创建数组
- 在for循环-Javascript中创建新对象
- 日期循环 Javascript
- 在循环 javascript 内部创建一个数组
- 使用 for 循环 JavaScript 的打印范围
- 使用RegExp循环数组而不是for循环(Javascript)
- 如何避免循环Javascript
- 如何停止循环 - Javascript 100%
- 我想让我的程序重新运行开头,有点像循环 JavaScript
- css转换在for循环javascript中无法正常工作
- 在for循环javascript中创建对象
- do/while语句中的if-elseif语句无限循环javascript
- 在for循环Javascript中对数字进行分类和计数
- 如何一次运行一次循环javascript
- 请,需要帮助循环Javascript事件
- 在递归循环javascript之后,为JSON键变量使用自定义HTML元素
- 嵌套循环javascript棋盘
- 如何重新启动循环javascript循环
- 在循环 JavaScript 之后刷新页面