Why for var在数组中返回一个字符串索引

Why for var in array returns a string index?

本文关键字:一个 索引 字符串 返回 var for 数组 Why      更新时间:2023-09-26

我真的很惊讶,在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 ...迭代

我的朋友,看看原型继承的奇迹和诅咒吧。使用for..in迭代的不是数组。您正在对Array对象进行迭代。看看文档:

数组索引只是具有整数名称和在其他方面与常规对象属性相同。没有保证。。。in将返回任何特定的索引order,它将返回所有可枚举属性,包括具有非整数名称和继承的名称。

因为迭代的顺序取决于实现在数组上可能不会以一致的顺序访问元素。因此最好使用带有数字索引的for循环(或Array.forEach或for。。。循环),其中访问很重要。

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

因此,您要处理的是Array对象中属性的可枚举"整数名称",而不是数字顺序。

EDITJavaScript中的for v in array与python中的for v in list不等价。它相当于for k, v in dict.iteritems(),但k隐含地作为一个具有整数名称的字符串提供给您,例如"1"、"2"、"3"等。我认为从OO的角度来看,这也是违反直觉的。列表/数组怎么可能是一个类似dict的对象?但从原型的角度来看,只要任何东西继承自Object.prototype,它就可以被视为具有键和属性的对象。