不要for..in
用于数组迭代。
重要的是要了解 Javascript Array 的方括号语法 ( []
) 用于访问索引实际上是从Object
...
obj.prop === obj['prop'] // true
该for..in
结构不像for..each/in
其他语言(php、python 等)中更传统的结构那样工作。
Javascriptfor..in
旨在迭代对象的属性。生成每个属性的密钥。将此键与Object
的括号语法结合使用,您可以轻松访问您想要的值。
var obj = {
foo: "bar",
fizz: "buzz",
moo: "muck"
};
for ( var prop in obj ) {
console.log(prop); // foo / fizz / moo
console.log(obj[prop]); // bar / buzz / muck
}
并且因为 Array 只是一个具有连续数字属性名称(索引)的对象,所以for..in
以类似的方式工作,产生数字索引就像它产生上面的属性名称一样。
该for..in
结构的一个重要特征是它会继续搜索原型链上的可枚举属性。它还将迭代继承的可枚举属性。由您来验证当前属性是否直接存在于本地对象上,而不是它附加到的原型上hasOwnProperty()
...
for ( var prop in obj ) {
if ( obj.hasOwnProperty(prop) ) {
// prop is actually obj's property (not inherited)
}
}
(更多关于原型继承)
for..in
在 Array 类型上使用结构的问题在于,对于属性的生成顺序没有保证……一般来说,这是处理数组的一个非常重要的特征。
另一个问题是它通常比标准for
实现慢。
底线
使用 afor...in
来迭代数组就像用螺丝刀的屁股钉钉子……你为什么不直接用锤子 ( for
) 呢?