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的错误。