JavaScript возведения в унарный оператор проектного решения
Так что я дурачился с новым оператором возведения в степень и обнаружил, что нельзя ставить унарный оператор непосредственно перед базовым числом.
let result = -2 ** 2; // syntax error
let result = -(2 ** 2); // -4
let x = 3;
let result = --x ** 2; // 4
В JavaScript невозможно написать неоднозначное выражение возведения в степень, т.е. вы не можете поставить унарный оператор (
+
/-
/~
/!
/delete
/void
/typeof
) непосредственно перед базовым номером.В большинстве языков, таких как PHP и Python и других, в которых есть оператор возведения в степень (обычно
^
или же**
), оператор возведения в степень определен, чтобы иметь более высокий приоритет, чем унарные операторы, такие как унарные+
и одинарный-
, но есть несколько исключений. Например, в Bash**
Оператор определен, чтобы иметь более низкий приоритет, чем унарные операторы.
Я понимаю, что это было сделано по ошибке. Я не понимаю это дизайнерское решение. Кто на самом деле будет удивлен, что -x ** 2
отрицательно? Это следует не только другим основным языкам программирования, но и математической нотации, которая использовалась в течение сотен лет и преподавалась каждому ученику средней школы по алгебре.
В JavaScript '1'+ 2
является '12'
а также '1'-2
является -1
но -1**2
выдает ошибку, потому что это может быть неоднозначным? Помогите мне понять это дизайнерское решение.
1 ответ
Я не понимаю это дизайнерское решение.
Узнайте больше об этом по адресу https://esdiscuss.org/topic/exponentiation-operator-precedence, https://esdiscuss.org/topic/power-operator-why-does-2-3-throws, https://github.com/rwaldron/tc39-notes/blob/master/es7/2015-09/sept-23.md#exponentiation-operator и https://github.com/rwaldron/tc39-notes/blob/master/es7/2015-09/sept-24.md#exponentiation-operator.
Кто на самом деле будет удивлен, что
-x ** 2
отрицательно?
Достаточно людей, чтобы иметь значение. Некоторые соответствующие цитаты из вышеупомянутых ресурсов:
- " делая
**
крепче, чем унарные операторыx**-2
, И делать его иногда более жестким, а иногда и более свободным будет слишком запутанным и приведет к другим возможностям для инверсии приоритетов. "- Вальдемар Хорват - " Учитывая конфликт между историей
**
в других языках [и] общий шаблон, который унарный связывает более тесно, чем бинарный, любое решение в этой точке может смутить многих людей. "- Марк С. Миллер - " признать перспективу значительных пробелов:
-x**2 === -(x ** 2)
а также-x ** 2 === (-x) ** 2
"- Александр Джонс - " Проблема в том, что, хотя редкий унарный минус перед выражением возведения в степень может заключаться в том, что не хватает sugests с надстрочным индексом с меньшим шрифтом,
-
крепче, чем**
, И действительно, кроме точки (особой формы, правый операнд которой должен быть лексическим идентификатором-именем) и квадратных скобок (которые сами по себе не являются инфиксными операторами), унарные операторы связываются жестче, чем двоичные в JS, как в C и других C- производные языки. "- Брендан Эйх - " Для математики кажется очевидным, что
-52
, Но для-5 ** 2
из-за пробела вокруг оператора инфикса. Даже без места,-
кажется частью буквального. "- Дейв Херман - [Относительно приоритета языка программирования], " фактически у нулевых людей есть интуиция об этом с других языков. Согласитесь, у людей есть интуиция, что
**
является оператором возведения в степень. Но люди обычно стараются избегать темных углов, чтобы никогда не развивать интуицию для отрицательных основ. "- Дейв Херман
В JavaScript
'1'+ 2
является'12'
а также'1'-2
является-1
но-1**2
выдает ошибку, потому что это может быть неоднозначным?
Что ж, они вкладывают значительно больше усилий в разработку расширений языка сегодня:-) Это лучшее решение, к которому они могут прийти к консенсусу.