Почему -1 ** 2 синтаксическая ошибка в JavaScript?
Выполняя его в консоли браузера, он говорит SyntaxError: Unexpected token **
.
Попробуйте его в node:
> -1**2
...
...
...
...^C
Я думал, что это арифметическое выражение, где **
- оператор мощности. Нет такой проблемы с другими операторами.
Странно, набрав */
во второй строке, запускается выполнение:
> -1**2
... */
-1**2
^^
SyntaxError: Unexpected token **
Что здесь происходит?
Ответы
Ответ 1
Выполнение этого в консоли браузера говорит SyntaxError: Неожиданный токен **.
Потому что spec. Разработан таким образом, чтобы избежать путаницы в том, является ли он квадратом отрицания одного (т.е. (-1) ** 2
) или отрицанием квадрата одного (т.е. -(1 ** 2)
). Этот дизайн был результатом обширного обсуждения приоритета оператора и изучения того, как это обрабатывается на других языках, и, наконец, было принято решение избежать неожиданное поведение, сделав это синтаксической ошибкой.
Ответ 2
Из документация по MDN:
В JavaScript невозможно написать неоднозначное выражение экспоненциальности, то есть вы не можете поставить унарный оператор (+
/-
/~
/!
/delete
/void
/typeof
) непосредственно перед базовым номером.
Причина также объясняется в том же тексте:
В большинстве языков, таких как PHP и Python, и других, у которых есть оператор экспоненции (обычно ^
или **
), оператор экспоненциальности имеет более высокий приоритет, чем унарные операторы, такие как унарные +
и унарные -
, но есть несколько исключений. Например, в Bash оператор **
имеет более низкий приоритет, чем унарные операторы.
Итак, чтобы избежать путаницы, было решено, что код должен устранить двусмысленность и явно поставить круглые скобки:
(-1)**2
или
-(1**2)
В качестве побочного примечания двоичный -
не обрабатывается таким образом - с более низким приоритетом - и поэтому последнее выражение имеет тот же результат, что и это допустимое выражение:
0-1**2
Приоритет экспоненциальности на других языках программирования
Как уже было подтверждено в приведенной выше цитате, большинство языков программирования, у которых есть оператор экспоненциального инфикса, дают более высокий приоритет этому оператору, чем унарный минус.
Вот некоторые примеры языков программирования, которые дают более высокий приоритет унарному оператору минус: