我真的很惊讶,在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 ...
迭代
答案 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
,它就可以被认为是具有键和属性的对象。