Какой логический оператор принимает приоритет
Итак, я изучаю несколько более сложную операцию с логическими операторами в инструкции 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
Полный список будет приятным, если вы можете найти его где-нибудь, порядка операций для этого. Спасибо!
Ответы
Ответ 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
)
Когда вы помните это, все, что вам нужно знать, это то, что умножение всегда приходит перед добавлением.
Ответ 4
https://developer.mozilla.org/en/JavaScript/Reference/Operators/Operator_Precedence
&&
до ||
, поэтому ваше выражение эквивалентно:
firstRun == true || (selectedCategory != undefined && selectedState != undefined)
Ответ 5
Он будет первым:
firstRun == true || (selectedCategory != undefined && selectedState != undefined)
Как правило, в большинстве языков программирования И имеет более высокий приоритет
Ответ 6
В то время как приоритет логического оператора фактически не определен в Спецификация ECMAScript, MDN неплохо справляется с этим и даже имеет отдельную страницу для Логические операторы.
Мое беспокойство, я полагаю, поскольку логическая операционная прецеденция на самом деле не определена в спецификации ECMAScript, каждый отдельный поставщик браузеров может потенциально отличаться (я говорю с вами, Internet Explorer!), поэтому YMMV.
В случае, если кто-то хочет протестировать это в разных браузерах, здесь скрипт сценария: http://jsfiddle.net/HdzXq/