javascript for循环计数器以字符串形式出现

时间:2014-03-18 12:27:23

标签: javascript string for-loop

我已将我的程序简化为此,但它仍然行为不端:

var grid = [0, 1, 2, 3];

function moveUp(moveDir) {
    for (var row in grid) {
        console.log('row:');
        console.log(row + 5);
    }
}

似乎row是一个字符串而不是一个整数,例如输出是

row:
05
row:
15
row:
25
row:
35

而不是5,6,7,8,这就是我想要的。 for循环中的计数器不应该是一个字符串吗?

3 个答案:

答案 0 :(得分:14)

引自MDN Docs of for..in

  

for..in不应该用于迭代索引顺序的Array   很重要。数组索引只是可枚举的属性   整数名称,并且与一般对象相同   属性。无法保证......中将返回   任何特定顺序的索引,它将返回所有可枚举的   属性,包括具有非整数名称和属性的属性   继承的。

     

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

您正在使用for..in迭代数组。那很不好。使用for..in进行迭代时,得到的是字符串格式的数组索引。

因此,在每次迭代中,'0' + 5 == '05''1' + 5 == '15' ...正在打印

你应该做的是,

for (var len = grid.length, i = 0; i < len; i += 1) {
    console.log('row:');
    console.log(grid[i] + 5);
}

有关为什么在迭代中返回完整数组索引以及其他有趣内容的更多信息,请查看this answer of mine

答案 1 :(得分:2)

对于数组,您应该使用正常的for循环而不是for...in循环。

for (var row = 0, l = grid.length; row < l; row++) {
  console.log('row:');
  console.log(5 + row);
}

我认为这是你预期的输出量。

Fiddle

答案 2 :(得分:0)

尝试使用parseInt(..)方法强制使用int值

console.log(parseInt(row,10) + 5);

第二个参数10将被解析为十进制值。

请在此处查看答案How do I add an integer value with javascript (jquery) to a value that's returning a string?