0
var yourObjects = [ 

{ object: {obj1:"aa"}, direction: 'top' },
{ object: "obj2", direction: 'left' }, 
{ object: "obj3", direction: 'bottom' }

]; 

for (var i in yourObjects) { alert(i); }

对此进行了长时间的讨论。使用for in迭代对象返回对象的所有属性和方法,因此通常应使用.hasOwnProperty()方法。但是当我们迭代一个数组时,实际上是在for in迭代数组的索引(如果它是关联数组,则迭代键)。我在我拥有的所有浏览器中都试过了。但是当在 jsfiddle 中尝试时......它不一样......返回了数组拥有的所有方法。

所以我的问题是:使用for in迭代数组是否安全?

在您的浏览器和 jsfiddle 中尝试此代码,然后告诉我您的想法。

4

1 回答 1

7

for-in不使用数组的原因不止一个。

请记住,在 JavaScript 中,数组只是对象的一种类型,因此for-in对数组进行操作与for-in对普通对象进行操作没有什么不同。

在您的 jsFiddle 中,您可能在左侧选择了一个名为 augmented 的库Array.prototype,这将是这些方法的来源。

但还有另一个原因。Afor-in不保证枚举属性的顺序。因为没有约束,它可以乱序枚举你的索引,并且完全符合 ECMAScript。

此外,还有一些类似数组的集合,比如 NodeList,也不应该使用for-in,因为它们包含除了 DOM 元素之外可以枚举的默认属性。

一个简单的事实是,在 JavaScript 中,for-in它不是基于索引的枚举的合适工具。


对于对象,您应该只hasOwnProperty在有特定需要时才需要使用它。

有人建议它必须用于所有对象。这是一种极度偏执的心理。这种方法是一种保护,应该在有意义的狭隘情况下使用。

大多数情况下,只要您遵循良好的编程习惯,使用它就没有任何意义。这包括不将可枚举属性放在Object.prototype. 制作一个编程环境只是一个简单而合理的要求。

确实有意义的时候是当您枚举从自定义构造函数创建的对象时,该构造函数.prototype具有可枚举属性的扩展。在这种情况下,它是一个合适的后卫。

在普通对象上使用它是巨大的矫枉过正,当一个更合理的方法是有简单的要求你的环境不会改变时Object.prototype

于 2012-09-26T04:02:55.097 回答