2012-06-22 11 views
26

Tak więc zajmuję się pisaniem nieco bardziej złożonej operacji z operatorami logicznymi w instrukcji if-else. Wiem, że mogę robić nawiasy i wiem, że to jest lepszy sposób na zrobienie tego, ale jestem ciekawy i dlatego zamierzam zapytać. Jeśli miałbym zrobić coś takiego:Który operator logiczny ma pierwszeństwo

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

Jak to będzie obsługiwane bez użycia nawiasów? Wiem, że istnieje kolejność operacji dla operatorów logicznych, podobnie jak w PEMDAS, prawda? Jestem ciekawy, czy to będzie prowadził coś takiego:

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

lub może jeśli Operator „lub” ma pierwszeństwo zamiast i kończy się dzieje jak:

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

pełną lista ta będzie bądź miły, jeśli możesz go gdzieś znaleźć, o kolejności operacji. Dzięki!

Odpowiedz

44

Moja zasada, która obejmuje w zasadzie 99% wszystkich przypadków użycia dla instrukcji warunkowych, to:

  1. Grupowanie: ()
  2. dostęp Użytkownik . or [...]
  3. Not: !
  4. porównania na przykład < , >= , === , !=, ...
  5. Logiczne AND &&
  6. Logiczne OR ||

MDN daje wyczerpujący podział: Javascript Operator Precedence

tak dla przykładu:

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

równa

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

W przypadku czegoś bardziej złożonego niż wyżej wymienione przypadki rozważałbym zrestrukturyzowanie kodu tak czy inaczej!

+0

Dokładnie to, co było potrzebne; dzięki – JTApps

+0

Co powiesz na "nowy"? Ma taki sam priorytet jak dostęp do elementu i wywoływanie funkcji, więc zakładam, że oznacza to od lewej do prawej? 'new Foo(). bar()' jest równoważne '(nowemu Foo()). bar()'? A 'new Foo() (3)' jest równoważne '(new Foo()) (3)'? – chharvey

1

To będzie pierwszy:

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

Zasadniczo w większości języków programowania i ma wyższy priorytet

7

Zobacz this chart for precedence.

Nie zamierzam wyjaśniać, co się dzieje, ponieważ następny facet czytający twój kod pomyśli: "WTF? Czy to robi to, co powinno?"

Dlatego lepszym rozwiązaniem jest, aby owinąć warunki w nawiasach nawet jeśli wiesz, że pierwszeństwo, zastosowano prawidłowo i kod działa

Wynika to starą mądrość, że nie należy robić wszystko można po prostu dlatego, że można to zrobić. Zawsze miej oko na konsekwencje.

+0

+1 za doradztwo w zakresie używania nawiasów. – geekchic

+0

Tak, rozumiem, o czym mówisz i jestem świadomy, że pytanie o mnie bardziej dotyczy osobistej wiedzy niż czegokolwiek. Dzięki – JTApps

1

Podczas Logical Pierwszeństwo Operator nie jest właściwie zdefiniowana w ECMAScript Specification, MDN robi całkiem dobrą robotę, a nawet ma oddzielną stronę dla Logical Operators.

Mój problem, przypuszczam, ponieważ pierwszeństwo logicznego operatora nie jest faktycznie zdefiniowane w specyfikacji ECMAScript, każdy poszczególny dostawca przeglądarki może potencjalnie być inny (mówię do ciebie, Internet Explorer!), Więc YMMV.

W każdemu wydarzeniu chce przetestować to na różnych przeglądarkach, oto przypadek testowy skrzypce: http://jsfiddle.net/HdzXq/

6

Jest całkiem dobra zasada do tego. Pomyśl o tych operatorów jako jedynek matematycznych:

  • AND jest mnożenie (. Np 0 * 1 = 0 => FALSE)
  • OR jest dodanie

Po tym pamiętać, wszystko co musisz wiedzieć (np 0 + 1 = 1 => TRUE). jest to, że mnożenie zawsze przychodzi przed dodaniem.

+1

jest to naprawdę miły mnemonik, zarówno jeśli chodzi o precyzję, jak i wartości wynikowych bitów! – Christoph