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