Сообщение от Дзен-трансгуманист
|
Выходит, что и тут и там в самом левом "икс" исходное значение сохраняется вплоть до последней операции, тогда как должно было измениться немедленно при (x ^= y) и (x += y) соответственно.
|
неа
var x = 10, y = 20;
x -= (y = ((x += y), alert("x = " + x), x) - y);
ещё примерчик, без игреков, чтобы было легче усвоить:
x = 3;
x += 3; // x = 6
x -= 9 - x; // 9 - 6 === 3
alert(x);
x = 3;
x -= ( 9 - ( x += 3 ) );
alert(x); // 0
после этого углубляемся в
спеку :
- Пусть lref будет результатом вычисления LeftHandSideExpression.
- Пусть lval будет GetValue(lref).
- Пусть rref будет результатом вычисления AssignmentExpression.
- Пусть rval будет GetValue(rref).
- Пусть r будет результатом применения оператора @ к lval и rval.
- Вызвать PutValue(lref, r) и вернуть r.
во втором примере (моём) берётся значение икса (3), далее вычисляется значение правой стороны ( тоже 3), потом честно применяется к ним минус, получаем нуль.
фишка в том, что X изменяется, но двиг уже взял его значение (старое), и не обновляет его (ящитаю)
т.е. в числах всё происходит так :
3 - (9 - (3 + 3)); // 3 - (6 - 3) -> 3 - 3.