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

abf*_*rid 33 javascript for-loop

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

for (var i in [1, 2, 3]) {
    console.log(i + 1);
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

// 01
// 11
// 21
Run Code Online (Sandbox Code Playgroud)

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

Der*_*ard 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
} 
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果您提交的代码不仅仅是一个简单的示例来说明更大的问题,请使用旧式的for(var i = 0; i <3; i ++){}` (6认同)
  • 虽然最终结果是OP想要的,但我认为这是一个糟糕的编程习惯. (2认同)
  • 你绝对不应该在这里使用`parseInt`.而是使用适当的循环. (2认同)

Ami*_*mit 18

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


D_4*_*_ni 11

我想你想要数组的值,而不是键.如果您不能使用ES6,Xorifelse的答案是有效的,但如果可以的话,那就for ... of完全按照您的想法运作:

for (let i of [1, 2, 3]) {
  console.log(i + 1);
}
Run Code Online (Sandbox Code Playgroud)

也有Array.prototype.forEach在ES5和高达:

[1, 2, 3].forEach(function(value, index) {
  console.log(value + 1);
});
Run Code Online (Sandbox Code Playgroud)


Xor*_*lse 9

使用in你遍历每个关键字关键的对象,而这些都是字符串类型和使用时+对操作字符串,将导致它做一个级联分配.

如果要执行算术赋值,则运算符的值和值都必须是整数类型.解决方案是尝试将字符串解析为整数:

console.log(parseInt("0") + 1); // 1
Run Code Online (Sandbox Code Playgroud)

但是......
你应该循环使用该:

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);
});
Run Code Online (Sandbox Code Playgroud)


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

for(let v of [1, 2, 3]) {
  console.log(v);
}
Run Code Online (Sandbox Code Playgroud)

这种方法的缺点是旧的Android设备不兼容,因为它有点新的标准.


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

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


dze*_*j.5 5

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


归档时间:

查看次数:

3785 次

最近记录:

8 年,8 月 前