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 выдает ошибку, потому что это может быть неоднозначным?

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

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