あなたが言ったように、式は左から右に評価されます。つまり、初めて a に遭遇したとき、その値はまだ5です。これは次のようになります。
var a = 5, b = 3;
a = ( a -( b = ( a = a+b ) - b ) );
a = 5 - (b = (a=(5+3)) - b);
a = 5 - (b = 8 - b);
a = 5 - 5; AND b = 5
2番目のものでは、 a 値は右側にあるため、代入後に評価されます
var a = 5, b = 3;
a = ( ( b = ( a = a+b ) - b ) - a );
a = ( ( b = 8 - b ) - a ); AND a = 8
a = ( 5 - 8 ); AND a = 8; AND b = 5;
a = - 3;
それはすべて、オペランドの評価の順序に帰着します。
通常、最初のケースでは、a が 5 に評価されてから がb = ( a = a+b ) - b
評価され、この評価中にのみ a の値が変更されますが、バックポートはされません。
2 番目の例で( b = ( a = a+b ) - b )
は、 が最初に評価され、a の値が 8 に変更されます。次に a が評価され、8 であることがわかります。
より簡単な例は次のとおりです。
var a = 5
a = a + (a = 2)
// a = 7
a
が 5 に評価され、次に(a = 2)
が 2 に評価されて a が 2 に設定され、次に5+2
が評価されて a が 7 に設定されます。
一方で :
var a = 5
a = (a = 2) + a
// a = 4
(a = 2)
は 2 に評価され、a は 2 に設定され、次にa
は 2 に評価され、次に2+2
は評価され、a は 4 に設定されます