Javascript中的操作执行顺序是否始终保持相同?

alm*_*now 5 javascript language-lawyer

当我做这样的事情时:

var x = 5;
console.log(         x  + (x += 10)  );  //(B) LOGS 10, X == 20
console.log(  (x += 10) +  x         );  //(A) LOGS  0, X == 30
Run Code Online (Sandbox Code Playgroud)

(A)和(B)之间的返回值的差异由其x评估时的值来解释.我认为后台应该发生这样的事情:

     TIME ---->
(A)         (x = 5) + (x += 10 = 15) = 20
(B) (x += 10 == 15) + (x == 15)      = 30
Run Code Online (Sandbox Code Playgroud)

但是这只有在且仅当它以与写入x的相同的从左到右的顺序进行评估时才成立.

所以,我有几个问题,

对于所有Javascript实现,这保证是否正确?

是否按标准定义了这种方式?

或者,这是Javascript世界中某种未定义的行为吗?

最后,同样的想法可以应用于函数调用,

var x = 5;
console.log(x += 5, x += 5, x += 5, x += 5); // LOGS 10, 15, 20, 25
Run Code Online (Sandbox Code Playgroud)

它们似乎也按顺序进行了评估,但有更强的保证,这应该始终发生吗?

Ber*_*rgi 2

这对于所有 Javascript 实现来说都是正确的吗?

是的。

标准是这样定义的吗?

是的,您可以在这里自己阅读。

具体来说,运行时语义:加法运算符 ( +)的求值指定左表达式在右表达式之前求值。

对于参数列表的评估也是如此。

或者,这是 Javascript 世界中某种未定义的行为吗?

是的,JavaScript 中有未定义的行为,但这里没有。