javascript for 循环计数器作为字符串出现

IT技术 javascript string for-loop
2021-03-03 21:12:06

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

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个回答

引自MDN Docs offor..in ,

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

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

您正在使用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);
}

有关为什么在迭代和其他有趣的东西中准确返回数组索引的更多信息,请查看我的这个答案

@Andy 两天前我有一个类似的问题,并深入解释了这种行为。请检查此答案中的链接答案。:)
2021-04-27 21:12:06
我想当你考虑它时,它是完全有道理的。
2021-05-02 21:12:06
+1。我知道循环对数组不利,我只是不知道为什么。
2021-05-04 21:12:06

您应该使用普通for循环而不是for...in数组循环。

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

我认为这就是您的预期输出应该是什么。

小提琴

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

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

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

请参阅此处的答案如何将带有 javascript (jquery) 的整数值添加到返回字符串的值?