不要使用 for..in
遍历数组。
重要的是要理解,Javascript 数组的方括号语法 ([]
) 用于访问索引实际上是从 Object
继承而来的......
obj.prop === obj['prop'] // true
for..in
结构不像其他语言(如 PHP、Python 等)中常见的更传统的
for..each/in
。Javascript 的
for..in
适用于迭代对象的属性,产生每个属性的键。使用这个键结合
Object
的方括号语法,您可以轻松地访问所需的值。
var obj = {
foo: "bar",
fizz: "buzz",
moo: "muck"
};
for ( var prop in obj ) {
console.log(prop);
console.log(obj[prop]);
}
由于数组是一个具有按顺序排列的数字属性名(索引)的对象,因此for..in
以类似的方式工作,产生与上面产生的属性名称相同的数字索引。
for..in
结构的一个重要特点是它继续沿着原型链搜索可枚举属性。它也会迭代继承的可枚举属性。你需要使用hasOwnProperty()
验证当前属性是否存在于本地对象上而不是其所附加的原型上...
for ( var prop in obj ) {
if ( obj.hasOwnProperty(prop) ) {
// prop is actually obj's property (not inherited)
}
}
(更多关于原型继承的内容)
在数组类型上使用for..in
结构的问题在于无法保证属性按什么顺序被产生...而通常来说,这是处理数组的一个非常重要的特征。
另一个问题是它通常比标准的for
实现慢。
底线
在数组上使用for…in
迭代就像用螺丝刀的臀部去打钉子...你为什么不直接用锤子(for
)呢?
for ( var button in buttons ) alert( button );
,这样你就可以看到for
..in
将button
设为了什么。 - Thai