Вопрос по if-statement, operator-precedence, javascript, logic – Какой логический оператор имеет приоритет

44

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

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

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

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

или, может быть, если «ИЛИ»; оператор имеет приоритет вместо этого и в конечном итоге будет выглядеть так:

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

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

Ваш Ответ

6   ответов
9

этот график для старшинства.

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

Таким образом, лучшее решение заключается в том, чтобы заключить термины в скобкиeven if you know the precedence, applied it correctly and the code works

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

+1 за рекомендации по использованию скобок.
Да, я понимаю, что вы говорите, и я знаю, что смысл спрашивать меня был больше для личных знаний, чем для чего-либо другого. Спасибо JTApps
19

рах как о математических:

AND is multiplication (eg. 0 * 1 = 0 => FALSE) OR is adding (eg. 0 + 1 = 1 => TRUE)

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

это действительно хорошая мнемоника, как с точки зрения приоритета, так и с точки зрения значений битов!
1

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

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

1

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

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

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

63

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

Grouping: () Member access . or [...] Not: ! Comparison, e.g. < , >= , === , !=, ... Logical AND && Logical OR ||

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

Итак, для вашего примера:

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

равняется

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

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

Именно то, что было нужно; Спасибо JTApps
@chharvey №new на самом деле работает с более низким приоритетом, чем. (оператор точки), что означаетnew Foo().bar() === new (Foo().bar()), Это до боли очевидно при попытке отформатировать текущее время сnew Date.toLocaleString() который выдает ошибку. Вместо этого нужно использовать(new Date).toLocaleString() или что-то совершенно другое, какDate.now().
Как насчетnew? Он имеет тот же приоритет, что и доступ к элементу и вызовы функций, поэтому я предполагаю, что это означает слева направо?new Foo().bar() эквивалентно(new Foo()).bar()? А такжеnew Foo()(3) эквивалентно(new Foo())(3)?
3

https://developer.mozilla.org/en/JavaScript/Reference/Operators/Operator_Precedence

&& раньше||, так что ваше выражение эквивалентно:

firstRun == true || (selectedCategory != undefined && selectedState != undefined)
Именно то, что мне было нужно, благодаря вам JTApps

Похожие вопросы