请考虑以下代码:
var arr = [111, 222, 333];
for(var i in arr) {
if(i === 1) {
// Never executed
}
}
它会失败,因为typeof i === 'string'
。
有这个方法吗?我可以显式地将i
转换为整数,但这样做似乎使用更简单的for in
而不是常规for
- 循环来破坏目的。
修改
我知道在比较中使用==
,但这不是一个选项。
答案 0 :(得分:8)
你有几个选择
转换为数字:
parseInt(i) === 1
~~i === 1
+i === 1
不要比较某种类型(使用==
代替===
):
i == 1 // Just don't forget to add a comment there
将for循环更改为(我会这样做,但这取决于您要实现的目标):
for (var i = 0; i < arr.length; i++) {
if (i === 1) { }
}
// or
arr.forEach(function(item, i) {
if (i === 1) { }
}
顺便说一句,你不应该使用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