JavaScript(错误?)仅将模数应用于使用这种语法的操作
JavaScript (erroneously?) only applying modulus to operation with this one syntax
我正在尝试递增一个变量,如果它达到某个数字,return 它会变为 0。逻辑上我试过了
i++ % number
但变量一直在增加。
我查了一下,发现这个 ,它有效:
i = (i + 1) % 3
我不明白为什么。它们在句法上看起来完全相同。
然后我发现,由于操作顺序,模数首先运行,然后 returning 1
(因为 1 模数任何东西总是 1)...然后只加 1至 i
.
似乎没有办法规避这一点。应用括号仅在有操作要完成时才有效,如果将数字括在括号中则没有任何区别。因此,您不能在 i++
上应用括号,因为它是 shorthand,而在 i += 1
上应用括号没有区别。你需要 (i + 1)
例如:
var i = 0;
var i2 = 0;
var i3 = 0;
$(document).click(function() {
i++ % 3;
i2 += 1 % 3;
i3 = (i3 + 1) % 3;
alert(i);
alert(i2);
alert(i3);
});
https://jsfiddle.net/z1wescrq/
点击输出。前 2 个变量保持递增,但第三个 return 变为 0,因为它首先进行加法。
JavaScript 有误吗?呃
i++ % 3;
让我们将这一行分成能清楚显示步骤的等效内容。
var temp = i++;
temp % 3;
i++
递增 i
并评估为 i
的先前值,该值存储在 temp
中。然后你评估 temp % 3
,然后......对结果不做任何事情。就像这样写语句:
2 + 2;
它的计算结果为 4 并且对 4 不做任何处理。与 i = (i + 1) % 3
的不同之处在于它计算模数然后将其分配回 i
而不是将其丢弃。
简而言之:不,这不是JavaScript的错误。
我正在尝试递增一个变量,如果它达到某个数字,return 它会变为 0。逻辑上我试过了
i++ % number
但变量一直在增加。
我查了一下,发现这个
i = (i + 1) % 3
我不明白为什么。它们在句法上看起来完全相同。
然后我发现,由于操作顺序,模数首先运行,然后 returning 1
(因为 1 模数任何东西总是 1)...然后只加 1至 i
.
似乎没有办法规避这一点。应用括号仅在有操作要完成时才有效,如果将数字括在括号中则没有任何区别。因此,您不能在 i++
上应用括号,因为它是 shorthand,而在 i += 1
上应用括号没有区别。你需要 (i + 1)
例如:
var i = 0;
var i2 = 0;
var i3 = 0;
$(document).click(function() {
i++ % 3;
i2 += 1 % 3;
i3 = (i3 + 1) % 3;
alert(i);
alert(i2);
alert(i3);
});
https://jsfiddle.net/z1wescrq/
点击输出。前 2 个变量保持递增,但第三个 return 变为 0,因为它首先进行加法。
JavaScript 有误吗?呃
i++ % 3;
让我们将这一行分成能清楚显示步骤的等效内容。
var temp = i++;
temp % 3;
i++
递增 i
并评估为 i
的先前值,该值存储在 temp
中。然后你评估 temp % 3
,然后......对结果不做任何事情。就像这样写语句:
2 + 2;
它的计算结果为 4 并且对 4 不做任何处理。与 i = (i + 1) % 3
的不同之处在于它计算模数然后将其分配回 i
而不是将其丢弃。
简而言之:不,这不是JavaScript的错误。