Подтвердить что ты не робот

Почему -1 ** 2 синтаксическая ошибка в JavaScript?

Выполняя его в консоли браузера, он говорит SyntaxError: Unexpected token **. Попробуйте его в node:

> -1**2
...
...
...
...^C

Я думал, что это арифметическое выражение, где ** - оператор мощности. Нет такой проблемы с другими операторами.

Странно, набрав */ во второй строке, запускается выполнение:

> -1**2
... */
-1**2
  ^^
SyntaxError: Unexpected token **

Что здесь происходит?

4b9b3361

Ответ 1

Выполнение этого в консоли браузера говорит SyntaxError: Неожиданный токен **.

Потому что spec. Разработан таким образом, чтобы избежать путаницы в том, является ли он квадратом отрицания одного (т.е. (-1) ** 2) или отрицанием квадрата одного (т.е. -(1 ** 2)). Этот дизайн был результатом обширного обсуждения приоритета оператора и изучения того, как это обрабатывается на других языках, и, наконец, было принято решение избежать неожиданное поведение, сделав это синтаксической ошибкой.

Ответ 2

Из документация по MDN:

В JavaScript невозможно написать неоднозначное выражение экспоненциальности, то есть вы не можете поставить унарный оператор (+/-/~/!/delete/void/typeof) непосредственно перед базовым номером.

Причина также объясняется в том же тексте:

В большинстве языков, таких как PHP и Python, и других, у которых есть оператор экспоненции (обычно ^ или **), оператор экспоненциальности имеет более высокий приоритет, чем унарные операторы, такие как унарные + и унарные -, но есть несколько исключений. Например, в Bash оператор ** имеет более низкий приоритет, чем унарные операторы.

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

(-1)**2

или

-(1**2) 

В качестве побочного примечания двоичный - не обрабатывается таким образом - с более низким приоритетом - и поэтому последнее выражение имеет тот же результат, что и это допустимое выражение:

0-1**2

Приоритет экспоненциальности на других языках программирования

Как уже было подтверждено в приведенной выше цитате, большинство языков программирования, у которых есть оператор экспоненциального инфикса, дают более высокий приоритет этому оператору, чем унарный минус.

Вот некоторые примеры языков программирования, которые дают более высокий приоритет унарному оператору минус: