Подтвердить что ты не робот

Какой логический оператор принимает приоритет

Итак, я изучаю несколько более сложную операцию с логическими операторами в инструкции if-else. Я знаю, что могу делать круглые скобки, и я знаю, что это лучший способ сделать это, но мне стало любопытно, и поэтому я собираюсь спросить. Если бы я сделал что-то вроде этого:

if (firstRun == true || selectedCategory != undefined && selectedState != undefined) {
//Do something
} else {
//Do something else
}

Как это будет работать без использования круглых скобок? Я знаю, что порядок операций для логических операторов, аналогичный PEMDAS, не так ли? Мне любопытно, будет ли это что-то вроде этого:

firstRun == true || (selectedCategory != undefined && selectedState != undefined)

или, может быть, если вместо этого оператор "OR" имеет приоритет, и он заканчивается следующим образом:

(firstRun == true || selectedCategory != undefined) && selectedState != undefined

Полный список будет приятным, если вы можете найти его где-нибудь, порядка операций для этого. Спасибо!

4b9b3361

Ответ 1

Мое правило, которое охватывает в основном 99% всех случаев использования условных операторов, составляет:

  • Группировка: ()
  • Доступ пользователя . or [...]
  • Не: !
  • Сравнение, например. < , >= , === , !=, ...
  • Логический И &&
  • Логический OR ||

MDN дает исчерпывающую разбивку: Приоритет оператора Javascript

поэтому для вашего примера:

(firstRun == true || selectedCategory != undefined && selectedState != undefined)

равно

(firstRun == true) || ((selectedCategory != undefined) && (selectedState != undefined))

Для чего-то более сложного, чем упомянутые выше случаи, я бы посмотрел на рефакторинг кода для удобочитаемости в любом случае!

Ответ 2

Смотрите эту таблицу для приоритета.

Я не собираюсь объяснять, что происходит, потому что следующий парень, читающий ваш код, подумает: "WTF? Это делает то, что нужно?"

Итак, лучшее решение состоит в том, чтобы обернуть термины в круглых скобках , даже если вы знаете приоритет, правильно применили его и код работает

Это следует старой мудрости, что вы не должны делать все, что только можете, потому что можете это сделать. Всегда следите за последствиями.

Ответ 3

Это довольно хорошее эмпирическое правило. Подумайте об этих операторах как о математических:

  • AND - умножение (например, 0 * 1 = 0 => FALSE)
  • OR добавляет (например, 0 + 1 = 1 => TRUE)

Когда вы помните это, все, что вам нужно знать, это то, что умножение всегда приходит перед добавлением.

Ответ 5

Он будет первым:

firstRun == true || (selectedCategory != undefined && selectedState != undefined)

Как правило, в большинстве языков программирования И имеет более высокий приоритет

Ответ 6

В то время как приоритет логического оператора фактически не определен в Спецификация ECMAScript, MDN неплохо справляется с этим и даже имеет отдельную страницу для Логические операторы.

Мое беспокойство, я полагаю, поскольку логическая операционная прецеденция на самом деле не определена в спецификации ECMAScript, каждый отдельный поставщик браузеров может потенциально отличаться (я говорю с вами, Internet Explorer!), поэтому YMMV.

В случае, если кто-то хочет протестировать это в разных браузерах, здесь скрипт сценария: http://jsfiddle.net/HdzXq/