Почему -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приоритет возведения в степень в других языках программирования
как уже утверждалось в приведенной выше цитате, большинство языков программирования, которые имеют оператор возведения в степень инфикса, дают более высокий приоритет вот оператор чем до унарного минуса.
вот некоторые другие примеры языков программирования, которые дают более высокий приоритет для оператора унарного минуса: