JavaScript操作顺序 - 在增量后运算符之前不计算括号

时间:2018-04-29 13:32:40

标签: javascript post-increment operator-precedence

示例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增加到2,然后将值赋给a给定括号具有最高的运算符优先级?感谢。

2 个答案:

答案 0 :(得分:2)

  

我理解第二个例子。 b被分配到a,然后递增到2

不完全。遗漏了一些细节,它是:

  1. 阅读b1)的值并将其放在一边。
  2. b增加到2
  3. 使b++表达式的结果为步骤1中留出的值(值1)。
  4. 将步骤3中的结果分配给a
  5. ...这就是()没有任何区别的原因。 :-) b++表达式的结果只是作为分组运算符(())的结果传播。

    the spec中的详细信息。

答案 1 :(得分:0)

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++周围的括号实际上等同于上面代码中ba = b周围的括号,而不是b + 1周围的括号。你的问题。很明显,括号a = (b)没有任何区别。

编辑正如您在评论中所建议的那样,如果我们将b++视为隐式函数,那么该函数的主体类似于TJ的解释:< / p>

  1. 保存b(1)的值,让我们说一个隐式变量x
  2. b增加到2
  3. 并返回x
  4. 在函数调用周围加上括号就像将它们放在返回值1附近。这是一个演示:

    &#13;
    &#13;
    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;
    }
    &#13;
    &#13;
    &#13;