乘法不是可交换的?

时间:2014-11-05 12:36:05

标签: javascript commutativity

乘法运算符可交换的ECMAScript语言规范specifies(A * B == B * A)。但是,如果A或B包含赋值运算符,则不成立。例如,如果我在浏览器的控制台中键入以下内容:

 var x = 1;
 (x + 2) * ((x = 4) + 1);
然而,

给出15:

 var x = 1;
 ((x = 4) + 1) * (x + 2)

给出30。

或者,一旦所有变量都被解析为其值,交换意味着它是可交换的吗?然而规范谈到了“*运算符”,而不是数学乘法运算。

1 个答案:

答案 0 :(得分:3)

问题是第二个例子中的x + 2是6而不是3,因为你已经签名x = 4;

意思是:

((x = 4) + 1)

会发生什么

(x + 2) == (4 + 2) == 6

(4+1) * 6 = 30

这是正常行为