To tłumaczenie jest niekompletne. Pomóż przetłumaczyć ten artykuł z języka angielskiego.

Operatory logiczne są zazwyczaj używane z wartościami typu Boolean (logicznymi) – wówczas zwracają również wartość typu logicznego. Jednakże operatory && i || w istocie zwracają wartość jednego z podanych operandów, więc jeśli operatory te są używane z wartościami nie-boolowskimi, wtedy mogą również zwracać nie-boolowskie wartości.
 

Opis

Operatory logiczne są opisane w poniższej tabeli:

Operator Użycie Opis
Logiczne AND (&&) expr1 && expr2 Zwraca expr1 jeśli wartość ta może być przekonwertowana na false, w przeciwnym razie zwraca expr2. Zatem, używany z wartościami typu logicznego, operator && zwraca true jeśli obydwa operandy mają wartość true, w przeciwnym razie zwraca false.
Logiczne OR (||) expr1 || expr2 Zwraca expr1, jeśli wartość ta może być przekonwertowana na true; w przeciwnym razie zwraca expr2. Tak więc, używany z wartościami typu logicznego, operator || zwraca true którykolwiek z operandów równy jest true.
Logiczne NOT (!) !expr Zwraca false jeśli jego operand można przekonwertować na true; w przeciwnym razie zwraca true.

Jeśli dana wartość może być przekonwertowana na true, wówczas jest to tzw. wartość truthy. Jeśli dana wartość może być przekonwertowana na false, jest to tzw. wartość falsy.

Przykładami wyrażeń, które mogą być przekonwertowane na false są:

  • null;
  • NaN;
  • 0;
  • pusty łańcuch znaków (string) – "" lub ''
  • undefined.

Mimo tego, że operatory && i || mogą być używane z wartościami nie-boolowskimi, nadal mogą być uznane za operatory boolowskie (logiczne), gdyż zwracane przez nie wartości mogą być zawsze przekonwertowane na wartości logiczne.

Ewaluacja short-circuit

Ponieważ wyrażenia logiczne są przetwarzane od lewej do prawej, sprawdzana jest najkrótsza możliwa ścieżka, pozwalająca na zwrócenie wyniku całego wyrażenia (tzw. short-circuit evaluation), zgodnie z następującymi zasadami:

  • false && (cokolwiek) zostanie przetworzone na false.
  • true || (cokolwiek) zostanie przetworzone na true.

Zasady logiki gwarantują, że powyższe ewaluacje są zawsze poprawne. Zauważ, że części wyrażeń oznaczone słowem cokolwiek nie są ewaluowane, więc nie pojawią się żadne efekty uboczne. Zauważ też, że część cokolwiek powyższych wyrażeń może być dowolnym pojedynczym wyrażeniem logicznym (co wskazano przez nawiasy).

Dla przykładu, poniższe dwie funkcje są równoważne.

function shortCircuitEvaluation() {  
  // logiczne OR (||)
  doSomething() || doSomethingElse();
  
  // logiczne AND (&&)
  doSomething() && doSomethingElse();
}

function equivalentEvaluation() {

  // logiczne OR (||)
  var orFlag = doSomething();
  if (!orFlag) {
    doSomethingElse();
  }
  
  
  // logiczne AND (&&)
  var andFlag = doSomething();
  if (andFlag) {
    doSomethingElse();
  }
}

Poniższe wyrażenia nie są jednak równoważne ze względu na pierwszeństwo operatorów, co podkreśla, jak ważne jest, by operator po prawej stronie był pojedynczym wyrażeniem (zgrupowanym w razie potrzeby przy pomocy nawiasów).

false && true  || true      // zwraca true
false && (true || true)     // zwraca false

Logiczne AND (&&)

Poniżej pokazane są przykłady użycia operatora && (logicznego AND).

a1 = true  && true       // t && t zwraca true
a2 = true  && false      // t && f zwraca false
a3 = false && true       // f && t zwraca false
a4 = false && (3 == 4)   // f && f zwraca false
a5 = 'Cat' && 'Dog'      // t && t zwraca "Dog"
a6 = false && 'Cat'      // f && t zwraca false
a7 = 'Cat' && false      // t && f zwraca false
a8 = ''    && false      // f && f zwraca ""
a9 = false && ''         // f && f zwraca false

Logiczne OR (||)

Poniżej pokazane są przykłady użycia operatora || (logicznego OR).

o1 = true  || true       // t || t zwraca true
o2 = false || true       // f || t zwraca true
o3 = true  || false      // t || f zwraca true
o4 = false || (3 == 4)   // f || f zwraca false
o5 = 'Cat' || 'Dog'      // t || t zwraca "Cat"
o6 = false || 'Cat'      // f || t zwraca "Cat"
o7 = 'Cat' || false      // t || f zwraca "Cat"
o8 = ''    || false      // f || f zwraca false
o9 = false || ''         // f || f zwraca ""

Logiczne NOT (!)

Poniżej pokazane są przykłady użycia operatora ! (logicznego NOT).

n1 = !true               // !t zwraca false
n2 = !false              // !f zwraca true
n3 = !'Cat'              // !t zwraca false

Zasady przekształcania wyrażeń

Przekształcanie AND na OR

Poniższa operacja na wartościach logicznych:

bCondition1 && bCondition2

jest zawsze równa:

!(!bCondition1 || !bCondition2)

Przekształcanie OR na AND

Poniższa operacja na wartościach logicznych:

bCondition1 || bCondition2

jest zawsze równa:

!(!bCondition1 && !bCondition2)

Przekształcanie NOT

Poniższa operacja na wartościach logicznych:

!!bCondition

jest zawsze równa:

bCondition

Usuwanie zagnieżdżonych wyrażeń z nawiasami

As logical expressions are evaluated left to right, it is always possible to remove parentheses from a complex expression following some rules.

Usuwanie zagnieżdżonego AND

Następujące wyrażenie złożone na wartościach logicznych:

bCondition1 || (bCondition2 && bCondition3)

jest zawsze równe:

bCondition1 || bCondition2 && bCondition3

Usuwanie zagnieżdżonego OR

Następujące wyrażenie złożone na wartościach logicznych:

bCondition1 && (bCondition2 || bCondition3)

jest zawsze równe:

!(!bCondition1 || !bCondition2 && !bCondition3)

Specyfikacje

Specyfikacja Status Uwagi
ECMAScript 1st Edition (ECMA-262) Standard Definicja początkowa.
ECMAScript 5.1 (ECMA-262) Standard Zdefiniowane w kilku sekcjach specyfikacji: Logical NOT Operator, Binary Logical Operators
ECMAScript 2015 (6th Edition, ECMA-262) Standard Zdefiniowane w kilku sekcjach specyfikacji: Logical NOT Operator, Binary Logical Operators
ECMAScript Latest Draft (ECMA-262) Draft Zdefiniowane w kilku sekcjach specyfikacji: Logical NOT Operator, Binary Logical Operators

Wsparcie przeglądarek

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidiOS SafariSamsung InternetNode.js
Logical AND (&&)Chrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes
Logical OR (||)Chrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes
Logical NOT (!)Chrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Zobacz też

Autorzy i etykiety dokumentu

Autorzy tej strony: jangromko
Ostatnia aktualizacja: jangromko,