为什么var in array返回一个字符串索引?

时间:2014-11-08 17:07:48

标签: javascript arrays iteration

我真的很惊讶,在Javascript:

> vals = ["a", "b", "c"]
> for (v in vals) console.log(v + 1)
01 
11 
21 

这是因为:

> for (v in vals) console.log(typeof(v))
string
string
string

所以我被迫做了类似的事情:

> for (v in vals) console.log(parseInt(v) + 1)
1 
2 
3 

为什么会这样?

我知道我能做到

> for (var v = 0; v < vals.length; v++) console.log(v + 1)
1 
2 
3 

但是与python一起使用我的思想设置为for ... in ...迭代

1 个答案:

答案 0 :(得分:3)

我的朋友,看到原型继承的奇妙和诅咒。您使用for..in进行迭代的不是数组。您正在遍历Array对象。看一下doc:

  

数组索引只是具有整数名称的可枚举属性   否则与一般对象属性相同。没有   保证for ... in将返回任何特定的索引   order,它将返回所有可枚举的属性,包括那些   使用非整数名称和继承的名称。

     

因为迭代的顺序是依赖于实现的,所以迭代   在数组上可能无法以一致的顺序访问元素。因此   最好使用带有数字索引的for循环(或Array.forEach   当迭代数组的顺序时,或者循环的for ...   访问很重要。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

所以你要处理的是Array对象中属性的可枚举“整数名称”,而不是数字顺序。

JavaScript中的

编辑 for v in array与python中的for v in list不等效。它相当于for k, v in dict.iteritems(),但k隐含地给你一个带整数名称的字符串,即“1”,“2”,“3”等。我认为它也是反直觉的。 OO立场。列表/数组如何成为类似dict的对象?但是从典型的角度来看,只要任何东西都继承自Object.prototype,它就可以被认为是具有键和属性的对象。