Как вы сказали, выражение оценивается слева направо, то есть при первом обнаружении 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
Во втором, значение 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 изменяется, но не переносится обратно.
Во втором примере сначала вычисляется ( 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
и устанавливается значение 7.
С другой стороны :
var a = 5
a = (a = 2) + a
// a = 4
(a = 2)
оценивается как 2 и a устанавливается на 2, затем a
оценивается как 2, затем оценивается 2+2
и a устанавливается на 4
person
njzk2
schedule
27.09.2013