2015-10-16 2 views
0

В языке JavaScriptОператоры присваивания, почему результат -3?

var a=3; 
a += a -= a*a; //-3 

В языке C:

int a=3; 
a += a -= a*a; //-12 
+0

В C результат не определен. В JS: https://es5.github.io/#x11.13.2 – kay

+3

ваш оператор эквивалентен 'a = a + (a = a - a * a);' - это упрощает понимание –

+1

... где внутреннее (правое) присваивание не имеет особого значения, потому что переменная сразу заменяется внешним (левым) назначением, поэтому это 'a = a + (a - (a * a))' – Bergi

ответ

3

В JS, операнды оператора, таких как +, =, * или += всегда оцениваются слева направо. Так что здесь происходит, шаг за шагом:

var a = 3;    // a = undefined 
a += (a -= a*a);  // a = 3 
a = 3 + (a -= a*a); // a = 3 
a = 3 + (a = 3 - a*a); // a = 3 
a = 3 + (a = 3 - 3*a); // a = 3 
a = 3 + (a = 3 - 3*3); // a = 3 
a = 3 + (a = 3 - 9); // a = 3 
a = 3 + (a = -6);  // a = 3 
a = 3 + -6;   // a = -6 
a = -3;    // a = -6 
-3;     // a = -3 

В отличие от этого, ваш код C делает оценить левую a только после того, как правая операнд, в котором точка a имеет значение -6, который затем добавляется к себе. Однако язык C оставляет это как неопределенное поведение и не определяет конкретный порядок оценок, поэтому вы испытали это только как артефакт своего компилятора. Подробности см. В комментариях к Kay.

-2

JavaScript назначения Траверс слева направо.

Вы говорите JS:

3 += 3 = 6 
6 -= 3*3 = -3 

Я не могу думать о перестановке этого, что привело бы к -12 ...

+0

Это может иметь тот же результат, но не то, что здесь происходит. – Bergi

+0

Btw, 'var a = 3; a - = a * a; a + = a' приводит к '-12' – Bergi

+0

Touche - ваш ответ гораздо точнее описывает, что здесь происходит. Придется провести некоторое тестирование, чтобы убедиться. Я думаю, что на самом деле более точно сказать, что операторы присваивания в JS оцениваются справа налево, нет? –

Смежные вопросы