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

Variable in for loop is a string

本文关键字:一个 字符串 循环 变量 for      更新时间:2023-09-26

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

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++) ?

很可能是因为在这个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
} 

原因是for .. in迭代对象属性("键"),即使对于数组也是如此。这里的"键"是数组的"索引"但它仍然只是对象键。因为所有的对象键都是字符串,所以i得到一个字符串值。

我想你想要的是数组的值,而不是键。如果你不能使用ES6, Xorifelse的答案是有效的,但如果你可以,有for ... of,正如你可能想象的那样工作:

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

在ES5及以上版本中也有Array.prototype.forEach:

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

使用in关键字循环遍历对象中的每个,这些都是字符串类型,当对字符串使用+运算符时,将导致它执行连接赋值。

如果要执行算术赋值,操作符的左值右值必须是整型。一种解决方案是尝试将字符串解析为整数:

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);
}

这种方法的缺点是不兼容旧的android设备,因为它是一个新的标准。


如果你正在使用jQuery,你也可以看看$。

$.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>

这是因为i是每个元素的键/索引,它是字符串类型。因此,您实际上是在连接string和int -结果是string。

这是因为使用"in"关键字遍历对象的键,而不是数组索引。但是在本例中,由于对象是一个数组,因此其中项的键是索引。最后,for. in循环中的键是字符串。

如果你需要数组的数字索引,你需要使用常规的for循环。

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

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

如果要将键转换为int,可以使用parseInt函数。链接!

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