我有一种情况,我正在尝试使用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...in
与hasOwnProperty
一起使用似乎更清晰。
答案 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/