2014-11-08 26 views
0

我一直很惊讶的是,在Javascript:为什么数组中的var返回一个字符串索引?

> 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 ...迭代

+2

*“...但是与python一起使用我的思维是用'for ... in ...'iteration”设置的* Python在这里是无关紧要的。这是JavaScript。所有对象属性都是字符串。使用'for'循环。 – 2014-11-08 17:10:56

+0

...... JS中有几个原因让我们用'for'代替数组中的'for-in'。然而,如果你真的想这样做,你可以缩短它到'console.log(+ v + 1);' – 2014-11-08 17:14:42

回答

3

我的朋友,不料原型继承的奇迹和诅咒。你正在迭代for..in不是一个数组。您正在遍历一个Array对象。看看文档:

数组索引只是具有整数名称的可枚举属性, 在其他方面与通用对象属性相同。没有 保证for ... in将返回任何特定 订单中的索引,并且它将返回所有可枚举的属性,包括具有非整数名称的 以及那些被继承的属性。

由于迭代的顺序与实现有关,因此在数组上迭代 可能无法以一致的顺序访问元素。因此, 最好在对数组访问顺序为 的数组进行迭代时使用带有数字索引(或Array.forEach 或for ... of循环)的for循环。

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

所以你面对的是在Array对象枚举“整数名”性质的,而不是数字顺序。

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

+0

非常感谢你,这真的解释了。 – neurino 2014-11-09 10:45:04

相关问题