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

Когда я использую оператор степени (**) в 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 возможно, хотя.

Другие вопросы по тегам