for循环中的变量是一个字符串

时间:2016-08-16 22:23:21

标签: javascript for-loop

我不确定这是否是正常行为,但运行此:

for (var i in [1, 2, 3]) {
    console.log(i + 1);
}

结果如下:

// 01
// 11
// 21

有人可以解释一下,为什么var i在这种情况下被视为字符串而不是for (var i = 0; i < [1, 2, 3].length; i++)

8 个答案:

答案 0 :(得分:37)

最有可能的原因是在这种for循环风格(for..in)中,它将i视为一个键,因为对象中的键通常是字符串(是的,数组是一种对象) javascript),它将它视为一个字符串。

parseInt(i)适用于这种情况,但对于良好的编程习惯,您可能希望使用类似于此的for循环:

var array = [1, 2, 3];
for (var i = array.length - 1; i >= 0; i--) {
    // do work with each array element here
} 

答案 1 :(得分:18)

原因是for .. in迭代对象属性(“keys”),即使对于数组也是如此。在这种情况下,“键”是数组的“索引”,但它仍然只是对象键。由于所有对象键都是字符串,i获取字符串值。

答案 2 :(得分:11)

我认为你想要数组的值,而不是键。如果您无法使用ES6,Xorifelse's answer可以使用,但如果可以的话,for ... of可以完全按照您的想法运作:

&#13;
&#13;
for (let i of [1, 2, 3]) {
  console.log(i + 1);
}
&#13;
&#13;
&#13;

ES5及以上版本中还有Array.prototype.forEach

&#13;
&#13;
[1, 2, 3].forEach(function(value, index) {
  console.log(value + 1);
});
&#13;
&#13;
&#13;

答案 3 :(得分:9)

使用in关键字循环对象中的每个,这些是 string 类型,并且在使用+运算符时在字符串上将导致它执行连接分配。

如果要执行算术分配,运算符的 left right 值都必须是整数类型。解决方案是尝试将字符串解析为整数:

console.log(parseInt("0") + 1); // 1

然而......
您应该循环遍历

var data = [1, 2, 3];

for(var key in data){
  console.log('a: data['+ key + '] = ' + data[key]);
}

for (var i = 0; i < data.length; i++) {
  console.log('b: data['+ i + '] = ' + data[i]);
}

data.forEach(function(value, index){
  console.log('c: data[' + index + '] = ' + value);
});

您可以使用ES6方法单独循环该值:

for(let v of [1, 2, 3]) {
  console.log(v);
}

这种方法的缺点是the incompatibility较旧的Android设备,因为它有点新的标准。

如果您正在使用jQuery,您还可以查看$.each,因为它允许在与旧设备兼容的漂亮单行中进行键值迭代。

$.each([1, 2, 3], function(index, value) {
  console.log( index + ": " + value );
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

答案 4 :(得分:5)

因为i是每个元素的键/索引,它是字符串类型。 所以你实际上是连接字符串和int - 结果是字符串。

答案 5 :(得分:4)

这是因为&#34; in&#34;关键字是遍历对象的键,而不是数组索引。但是在这种情况下,由于对象是一个数组,因此项目的键是索引。最后,for..in循环中的键是字符串。

因此,如果您需要数组的数字索引,则需要使用常规for循环。

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

答案 6 :(得分:3)

当你使用for...in循环时,你正在访问一个对象的每个键。数组是对象,它们的键是数字,但通常对象键被视为字符串。

如果要将密钥转换为int,可以使用parseInt函数。 link!

答案 7 :(得分:-5)

&#13;
&#13;
for (var i in [1, 2, 3]) {
    console.log(parseInt(i) + parseInt(1));
}
&#13;
&#13;
&#13;