Умножение не коммутативно?
Спецификация языка ECMAScript указывает, что оператор умножения является коммутативным (A*B==B*A). Однако это не имеет места, если A или B включает оператор присваивания. Например, если я наберу следующее в консоли браузера:
var x = 1;
(x + 2) * ((x = 4) + 1);
дает 15, однако:
var x = 1;
((x = 4) + 1) * (x + 2)
дает 30.
Или коммутативное означает, что оно коммутативно, когда все переменные были преобразованы в их значения? Однако спецификация говорит о "* операторе", а не о математической операции умножения.
1 ответ
Проблема в том, что x+2 во втором примере - 6 вместо 3, потому что вы уже присвоили x=4;
значение после:
((x = 4) + 1)
что происходит
(x + 2) == (4 + 2) == 6
а также
(4+1) * 6 = 30
это нормальное поведение