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
.
不完全是。省略一些细节,它是:
- 读取
b
(1
)的值并放在一边。
- 将
b
增加到 2
。
- 使
b++
表达式的结果成为步骤 #1 中预留的值(值 1
)。
- 将第 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 = b
行 b
周围的括号,而不是 b + 1
周围的括号从你的问题中思考。很明显括号 a = (b)
没有任何区别。
EDIT 正如您在评论中建议的那样,如果我们将 b++
视为隐式函数,那么函数体类似于 T.J.的解释:
- 保存
b
的值(1),假设给一个隐式变量x
- 将
b
增加到 2
- 和return
x
将括号放在函数调用周围就像将它们放在 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;
}
示例 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 toa
, then incremented to2
.
不完全是。省略一些细节,它是:
- 读取
b
(1
)的值并放在一边。 - 将
b
增加到2
。 - 使
b++
表达式的结果成为步骤 #1 中预留的值(值1
)。 - 将第 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 = b
行 b
周围的括号,而不是 b + 1
周围的括号从你的问题中思考。很明显括号 a = (b)
没有任何区别。
EDIT 正如您在评论中建议的那样,如果我们将 b++
视为隐式函数,那么函数体类似于 T.J.的解释:
- 保存
b
的值(1),假设给一个隐式变量x
- 将
b
增加到 2 - 和return
x
将括号放在函数调用周围就像将它们放在 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;
}