Почему возникает синтаксическая ошибка, когда левый операнд оператора возведения в степень отрицателен?

Когда я использую оператор экспоненты (**) в JavaScript, он обычно работает так, как ожидалось:

2 ** 2   // 4
2 ** -2  // 0.25

Но когда левый операнд отрицательный

-2 ** 2

Я получаю синтаксическую ошибку:

Uncaught SyntaxError: неожиданный токен **

Я могу легко обойти это, заключив скобки вокруг -2

(-2) ** 2 // 4

но мне любопытно, что вызвало эту ошибку. У других операторов (+ - * / % и т. д.) такой проблемы нет. Почему это происходит для оператора **?


person Peter Olson    schedule 30.08.2018    source источник


Ответы (2)


Такое поведение является преднамеренным и предназначено для предотвращения написания двусмысленных выражений. Из MDN:

В большинстве языков, таких как PHP и Python и других, которые имеют оператор возведения в степень (**), оператор возведения в степень имеет более высокий приоритет, чем унарные операторы, такие как унарный + и унарный -, но есть несколько исключений. Например, в Bash оператор ** имеет более низкий приоритет, чем унарные операторы. В JavaScript невозможно написать неоднозначное выражение возведения в степень, т.е. нельзя ставить унарный оператор (+/-/~/!/delete/void/typeof) непосредственно перед базовым числом.

-2 ** 2; 
// 4 in Bash, -4 in other languages. 
// This is invalid in JavaScript, as the operation is ambiguous. 


-(2 ** 2); 
// -4 in JavaScript and the author's intention is unambiguous.
person CRice    schedule 30.08.2018

Интересно. Я нашел документацию по Mozilla, в которой указано, почему это невозможно.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Exponentiation

2**-3 можно, правда.

person TheVirtuoid    schedule 30.08.2018