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