为什么我的 for 循环中出现奇怪的增量?

Why am I getting weird increments in my for loop?

我一直在测试检查字符串中单个字符的数值的方法。我设置了一个遍历它们的 for 循环,但是当我将它记录到控制台时,我得到了一个奇怪的响应:

isNumeric: function(n){
    for(var i = 0; i < n.length; i++){
        console.log("Looping " + i+1);
    }
},

所以我传入了值"10"来测试一下。当我调用该函数时,我得到了一个奇怪的响应。我在控制台上收到了两个日志(如预期的那样),但它显示

Looping 01
Looping 11

这是怎么回事?我不认为我在这里连接字符串,但出于某种原因它认为我是?我将 i 声明为整数 var i = 0;,当你将它递增 1 时,它在做什么?

我认为它必须做的唯一另一件事是记录附加到 Looping 0Looping 1 的其他内容,但我认为情况并非如此。

如果有人能帮忙,这真的很烦我,我似乎无法解决它。

提前致谢。

你的意思是console.log("Looping " + (i+1)); “1”作为字符串附加。

console.log("Looping " + i+1); 从左到右解析为 ("Looping " + i) + 1。在正确的位置添加括号,它应该可以工作:

console.log("Looping " + (i+1));

问题出在您进行实际日志记录的行中:

console.log("Looping " + i+1);

第一个 "Looping " + i 发生。

因为 "Looping" 是一个字符串,所以 i 被强制转换为一个字符串并附加到 "Looping"

结果:

"Looping 0"

然后,1 以同样的方式添加。

"Looping 01"

如果您想避免这种情况发生,请像这样使用括号:

isNumeric: function(n){
    for(var i = 0; i < n.length; i++){
        console.log("Looping " + (i+1));
    }
},

您是在连接字符串,而不是添加数字。首先,i 的值被强制转换为字符串并连接到 Looping,结果是 Looping 0。然后,数字 1 被转换为字符串并连接起来,结果就是您所看到的:Looping 01.

要获得您想要的结果,只需将 i+1 放在括号中即可。

console.log("Looping " + (i+1));

+left-to-right associative。表达式被计算为

('Looping ' + i) + 1

现在是否更清楚为什么要执行字符串连接?如果 + 操作的两个操作数中的 any 是字符串,则执行字符串连接。 'Looping ' 是一个字符串,因此 'Looping ' + i 结果是一个字符串。

要更改优先级或关联性,您必须使用分组 "operator" ((...))。

他们加括号是对的,整个代码是:

isNumeric: function(n){
    for(var i = 0; i < n.length; i++){
        console.log("Looping " + (i+1));
    }
},

将您的结果与此进行比较:

n=[1,2,3,4]

function isnum(n){
    for(var i = 0; i < n.length; i++){
        console.log("Looping " + i+1);
        console.log("Looping " + (i+1));
    }
}

isnum(n);

这会生成输出:

Looping 01
Looping 1
Looping 11
Looping 2
Looping 21
Looping 3
Looping 31
Looping 4

在语句 "Looping " + i+1 中发生的事情是 "Looping " + i 首先发生,我被强制转换为字符串值以与 "Looping " 连接。 1 也被转换为用于串联的字符串值。通过在 i+1 周围放置括号,我们可以强制 (i+1) 在连接之前首先作为加法发生,因此输出是您所期望的。