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