Почему -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

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

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

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

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