在javascript中对数字数组的迭代返回字符串

时间:2013-12-11 14:15:17

标签: javascript

为什么

for (i in [1, 2, 3]) console.log(typeof(i), i);

给出了这个:

[Log] string 0
[Log] string 1
[Log] string 2

我期待数字。

@Safari 7.0(9537.71),Mac OS X 10.9

2 个答案:

答案 0 :(得分:4)

Try instead

var arr = [1, 2, 3];
for (var i in arr)
    console.log(typeof arr[i], arr[i]);

你得到string而不是number因为for..in loops迭代键/属性(在这种情况下是Array的索引)而不是值。

要获取每个密钥i的值,您必须使用property accessorarr[i]


但是,为什么字符串根本不是原始数字索引是因为,按照现行标准,all properties are strings

console.log(Object.keys( ['foo', 'bar', 'baz'] )); // ["0", "1", "2"]

任何值实际上都可以与属性访问器一起使用,但在它实际用作键/属性之前,它将被转换为ToString()

  

6)让 propertyNameString ToString propertyNameValue )。

MapsSymbol目前计划作为例外。


此外,您可能会发现感兴趣的“Why is using “for…in” with array iteration such a bad idea?”,至少考虑使用简单的for循环:

var arr = [1, 2, 3];
for (var i = 0, l = arr.length; i < l; i++)
    console.log(typeof arr[i], arr[i]);

但是,为了将来参考,即将到来的ECMAScript 6 standard已添加了for..of loops,它应按照您的预期进行迭代。

for (var i of [1, 2, 3])
    console.log(typeof i, i); // number, 1, 2, 3

答案 1 :(得分:2)

这是因为Javascript中的Array是一个特殊的Object,其属性键(字符串)用作索引。 您正在将ArrayObject进行迭代,因此i被视为属性key,是一个字符串。

要以正确的方式迭代Array,您必须使用以下内容:

for( var i=0; i < [1,2,3].length; i++){ ... }