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


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

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

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

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

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

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

2 56

2 ответа:

выполнение его в консоли браузера говорит SyntaxError: Unexpected token **.

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

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

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

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

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

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

(-1)**2

или:

-(1**2) 

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

0-1**2

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

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

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