我不确定这是否是正常行为,但运行此:
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++)
?
答案 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
可以完全按照您的想法运作:
for (let i of [1, 2, 3]) {
console.log(i + 1);
}
&#13;
ES5及以上版本中还有Array.prototype.forEach
:
[1, 2, 3].forEach(function(value, index) {
console.log(value + 1);
});
&#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)
for (var i in [1, 2, 3]) {
console.log(parseInt(i) + parseInt(1));
}
&#13;