JavaScript 运算顺序 - 在 post 递增运算符之前不计算括号

JavaScript order of operations - parentheses are not evaluated before post-increment operator

示例 1:

var a = 0;
var b = 1;
a = (b++);
console.log(a);

a 等于 1 是一样的,带或不带括号。示例 2:

var a = 0;
var b = 1;
a = b++;
console.log(a);

我理解第二个例子。 b 分配给 a,然后递增到 2。但是在第一个例子中,为什么括号不强制 b 在将值赋给 a 之前递增到 2,因为括号具有最高的运算符优先级?谢谢。

I understand the second example. b is assigned to a, then incremented to 2.

不完全是。省略一些细节,它是:

  1. 读取b1)的值并放在一边。
  2. b 增加到 2
  3. 使 b++ 表达式的结果成为步骤 #1 中预留的值(值 1)。
  4. 将第 3 步的结果分配给 a

...这就是 () 没有任何区别的原因。 :-) b++ 表达式的结果只是作为分组运算符 (()) 的结果传播的。

详情见the spec

T.J的解释。在发生的事情的理论层面上是一个很好的,但这里是另一个从不同角度(比理论更实际)的解释:

我们有两个相似的表达式b++++b。两者都表示 b = b + 1,但它们的工作方式不同。

b++ 求得 b 的当前值(即 1),然后递增它。相当于:

var a = 0;
var b = 1;
a = b;
b = b + 1; //(b + 1) makes no difference
console.log(a);

++b 做相反的事情,增加 b,然后计算增加的​​值。相当于:

var a = 0;
var b = 1;
b = b + 1; //(b + 1) makes no difference
a = b;
console.log(a);

现在请注意,在上述任何示例中添加圆括号包围 b + 1 都不会产生任何影响,因为赋值 a = b 是在不同的步骤中完成的。类似地,向 b++ 添加括号不会有任何区别,因为对 a 的赋值和归罪是在两个不同的步骤中完成的。

然而,b++ 周围的括号实际上相当于上面代码中 a = bb 周围的括号,而不是 b + 1 周围的括号从你的问题中思考。很明显括号 a = (b) 没有任何区别。

EDIT 正如您在评论中建议的那样,如果我们将 b++ 视为隐式函数,那么函数体类似于 T.J.的解释:

  1. 保存b的值(1),假设给一个隐式变量x
  2. b 增加到 2
  3. 和returnx

将括号放在函数调用周围就像将它们放在 returned 值周围,即 1。这是一个演示:

var a = 0;
var b = 1;
a = bPlusPlus(); //(bPlusPlus()) makes no difference
console.log(a);

function bPlusPlus() {
  var x = b;
  b = b + 1;
  return x;
}