Почему возникает синтаксическая ошибка, когда левый операнд оператора возведения в степень отрицателен?
Когда я использую оператор степени (**
) в JavaScript он обычно работает как положено:
2 ** 2 // 4
2 ** -2 // 0.25
Но когда левый операнд отрицательный
-2 ** 2
Я получаю синтаксическую ошибку:
Uncaught SyntaxError: Неожиданный токен **
Я могу легко обойти это, поставив круглые скобки -2
(-2) ** 2 // 4
но мне любопытно, что послужило причиной этой ошибки. Другие операторы (+ - * / %
и т.д.) не имеют этой проблемы. Почему это происходит для **
оператор?
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.
Интересно. Я нашел некоторую документацию по Mozilla, в которой указано, почему это невозможно.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators
2 ** -3 возможно, хотя.