Цепное присваивание переменных с операторами в JavaScript

Я хочу сделать что-то с парой переменных, используя операторы в быстрой последовательности. Я недумаюкакие Я хочу сделать это важно как таковое; Мой вопрос больше об основах оценки JavaScript.

В трех приведенных ниже примерах я пытаюсь использовать сложение, чтобы изменить значения двух переменных. Однако не все выступают так, как я (возможно, наивныйочень) ожидаемо.

JSFiddle здесь.

ОПЕРАЦИИ КАК ТРИ ОТДЕЛЬНЫХ ЗАЯВЛЕНИЯ

var a = 9, b = 2;
a += b; b += a; a += b;
// a === 24, b === 13

ОПЕРАЦИИ, РАЗДЕЛЕННЫЕ ОПЕРАТОРОМ КОММА

var a = 9, b = 2;
a += b, b += a, a += b;
// AS EXPECTED: a === 24, b === 13

ОПЕРАЦИИ В ОДНОМ ЗАЯВЛЕНИИ / ВЫРАЖЕНИИ

var a = 9, b = 2;
a += (b += (a += b)); 
// BUT HERE WE GET THIS: a === 22, b === 13

В последнем примереb оценивает как положено, ноa оценивает номер два, если не считать того, что появляется в первых двух примерах.

Я думаю, что это потому, что все в скобках возвращает правильное значение, но, наконец, добавляется к исходному значениюaт.е.9, а не значение, предложенное(a += b) ранее в приоритете, который был бы.11

Я искал, почему это может быть в ФланаганаJavaScript: полное руководство (6-е изд.), (Особенно под 4.11.1 "Задание с операцией ") но там ничего не нашел. Крокфорд не делаетКажется, это явно упоминается вХорошие части или. Я'Мы использовали различные условия поиска, чтобы попытаться найти больше информации об этом поведении. Может ли кто-нибудь сказать мне, как называется это явление, или указать мне некоторую информацию об этом поведении (при условии, что оно ожидается) или о том, что я могу делать неправильно (при условии, что это 'нет)?

NB. Я'Я осознаю, что скобки в примере 3 могут быть излишними, поскольку, как я понимаю, приоритет присваивания идет в любом случае справа налево. Но я подумал, что если они будут там, это будет проще для примера.

ОБНОВИТЬ

Судя по ответам ниже, я думаю, что мое замешательство по этому вопросу на самом деле связано с тем, что я усвоил пару абзацев из книги Фланагана, возможно, неправильно:

В большинстве случаев выражение:

a op= b

гдеоп является оператором, эквивалентным выражению:

a = a op b

В первой строке выражениеa оценивается один раз. Во втором он оценивается дважды. Два случая отличаются только если сторонаa включает в себя побочные эффекты, такие как вызов функции или оператор приращения. Например, следующие два назначения не совпадают:

data[i++] *= 2
data[i++] = data[i++] * 2

Я понял, что это означает, что мой однострочный пример должен давать те же результаты, что и два других, потому что:

Фланаган упоминает две оценки, происходящие вa = a op b в отличие от одного, подразумевая, что это на самом деле отличается отa op= b гдеa не оценивается какlval справа.Я предположил, что оператор присваивания, который я использовал (например,a += b) будет считаться побочным эффектом.

ИМХО, я думаю, что Фланаган сделал это запутанным, и это, кажется, противоречит тому, чтоs в соглашении ECMAScript (как вставлено нижеpocka), но это может быть мое чтение / неверное толкование. Что он говорит неправильно или просто неясно? Или это только у меня так?

Ответы на вопрос(2)

Ваш ответ на вопрос