for(in)循环索引是字符串而不是整数

时间:2014-06-06 08:37:36

标签: javascript for-loop

请考虑以下代码:

var arr = [111, 222, 333];
for(var i in arr) {
    if(i === 1) {
        // Never executed
    }
}

它会失败,因为typeof i === 'string'

有这个方法吗?我可以显式地将i转换为整数,但这样做似乎使用更简单的for in而不是常规for - 循环来破坏目的。

修改

我知道在比较中使用==,但这不是一个选项。

5 个答案:

答案 0 :(得分:8)

你有几个选择

  1. 转换为数字:

    parseInt(i) === 1
    ~~i === 1
    +i === 1
    
  2. 不要比较某种类型(使用==代替===):

    i == 1 // Just don't forget to add a comment there
    
  3. 将for循环更改为(我会这样做,但这取决于您要实现的目标):

    for (var i = 0; i < arr.length; i++) {
       if (i === 1) { }
    }
    
    // or
    
    arr.forEach(function(item, i) {
       if (i === 1) { }
    }
    
  4. 顺便说一句,你不应该使用for...in来遍历数组。请参阅文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

      

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

         

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

答案 1 :(得分:3)

使用===,您还可以比较值的类型。请改用==

if ( i == 1 ) {}

或将i转换为整数:

if ( +i === 1 ) {}

您也可以尝试使用&#39;标准&#39; for循环:

for (var i = 0; i < arr.length; i++) {
    if (i === 1) {}
}

答案 2 :(得分:3)

如果您不需要IE9以下的浏览器支持,则可以使用Array.forEach

如果你这样做,请使用好的&#39; for (i = 0; i < arr.length; i++) {}循环。

答案 3 :(得分:1)

这是什么意思?

var arr = [1, 2, 3];
for(var i in arr) { //i is not the value of an element of the array, but its "attribute name"
    if(arr[i] === 1) {

    }
}

无论如何,我会使用古老的经典for语法,这是处理数组的推荐方法

答案 4 :(得分:0)

for-in循环对象中的属性,您可以使用for-of循环数组。

for (const i in [11, 22, 33, 44, 55]) {
    console.log(`${typeof i}: ${i}`);
}
string: 0
string: 1
string: 2
string: 3
string: 4

const obj = {
    11: 'a',
    22: 'b',
    33: 'c',
    44: 'd',
    55: 'e',
}
for (const i in obj) {
    console.log(`${typeof i}: ${i} -> ${obj[i]}`);
}
string: 11 -> a
string: 22 -> b
string: 33 -> c
string: 44 -> d
string: 55 -> e

for (const i of [11, 22, 33, 44, 55]) {
    console.log(`${typeof i}: ${i}`);
}
number: 11
number: 22
number: 33
number: 44
number: 55