← Lekcje
JavaScript · lekcja 06

Operatory 2/2:
porównujemy i łączymy warunki

Dzisiaj:

  1. Dwa znaki równości: == kontra ===
  2. Reszta porównań: < > <= >= i != !==
  3. Operatory logiczne: &&, || i !
  4. Ćwiczenie przy komputerze: warunek złożony z wiekiem i dowodem
Rozgrzewka · 3 minuty

Rozgrzewka: operatory arytmetyczne

  1. Co zwróci "5" + 3 w JavaScript?
  2. Czym różni się x++ od ++x?
  3. Jaki jest krótszy zapis działania x = x + 10?
Część 1 · Operatory porównania

== kontra ===

Operator porównania sprawdza, czy dwie wartości są sobie równe, i zwraca true albo false. W JavaScript są dwa znaki równości: == porównuje same wartości i po drodze zamienia typ, === porównuje wartość i typ naraz - nic nie zamienia. To jak dwa sita: jedno przepuszcza 5 i "5" razem, drugie tylko wtedy, gdy typ też się zgadza.

== (dopuszcza różne typy) 5 == "5" true === (typ musi się zgadzać) 5 === "5" false

Ciekawostka z MDN: null i undefined to w == wyjątek specjalny - jeśli jedna strona to null albo undefined, druga też musi nią być, żeby wynik był true. Dlatego 0 == null daje false, mimo że 0 samo w sobie liczy się jako falsz.

MDN: Learn_web_development/Core/Scripting/Math (sekcja „Comparison operators”) · ciekawostka: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Equality („If one of the operands is null or undefined, the other must also be null or undefined to return true. Otherwise return false.”, tłum. własne: „Jeśli jeden z operandów to null lub undefined, drugi też musi być null lub undefined, żeby zwrócić true. W przeciwnym razie zwraca false.”)
Część 2 · Reszta porównań

Mniejsze, większe, różne

Oprócz równości JavaScript ma cztery znaki do porównywania liczb, takie same jak w matematyce, i dwa znaki „różne”.

ZapisNazwaPrzykładWynik
<mniejszy niż10 < 6false
>większy niż10 > 20false
<=mniejszy lub równy3 <= 2false
>=większy lub równy5 >= 4true
!=różne (dopuszcza różne typy)5 != "5"false
!==różne wartości lub różne typy5 !== "5"true
MDN: Math (sekcja „Comparison operators”, tabela operatorów)
Część 3 · Operatory logiczne

&&, || i !

&& (AND) łączy warunki: całość jest prawdziwa tylko wtedy, gdy WSZYSTKIE warunki są prawdziwe. || (OR) łączy warunki inaczej: całość jest prawdziwa, gdy CHOĆ JEDEN warunek jest prawdziwy. ! (NOT) odwraca wartość - zamienia true na false i odwrotnie.

A B A && B A || B true true true true true false false true false true false true false false false false ! (NOT) - odwraca !true → false !false → true
MDN: Learn_web_development/Core/Scripting/Conditionals (sekcja „Logical operators: and, or, and not”)
Część 4 · Łączenie warunków

Warunek złożony

Warunki porównania można łączyć operatorem logicznym w jedno wyrażenie. Przykład: żeby ktoś mógł wypożyczyć coś tylko dla dorosłych, musi mieć skończone 18 lat i mieć przy sobie dowód - obie rzeczy naraz, więc &&.

age >= 18 hasIdCard && age=20, hasIdCard=true → true age=16, hasIdCard=true → false
Część 5 · Częsty błąd

Pułapka: = zamiast ==

Jeden znak = to przypisanie (wstawia nową wartość do zmiennej), dwa znaki == (albo trzy ===) to porównanie. Pomylenie ich w warunku if to jeden z najczęstszych błędów początkujących - kod się uruchamia bez czerwonego komunikatu, ale działa źle.

błąd: przypisanie w if x = 5; y = 3; if (x = y) ... x dostaje wartość y (3) - warunek wychodzi „prawda” poprawnie: porównanie w if x = 5; y = 3; if (x == y) ... x zostaje bez zmian (5) - warunek wychodzi „fałsz”
ESLint, reguła no-cond-assign (eslint.org/docs/latest/rules/no-cond-assign) blokuje dokładnie ten błąd
Egzamin EE.09 / E.14

Tak pytają na egzaminie

1. W języku skryptowym JavaScript operatory: ||, && należą do grupy operatorów

  1. bitowych.
  2. logicznych.
  3. przypisania.
  4. arytmetycznych.

2. W ramce przedstawiono kod JavaScript z błędem logicznym. Program powinien wypisywać informację, czy liczby są sobie równe czy nie, lecz nie wykonuje tego. Wskaż odpowiedź, która dotyczy błędu.

var x = 5;
var y = 3;
if (x = y)  document.getElementById("demo").innerHTML = 'zmienne są równe';
else        document.getElementById("demo").innerHTML = 'zmienne się różnią';
  1. Nieprawidłowo zadeklarowano zmienne.
  2. Przed klauzulą else nie powinno być średnika.
  3. W klauzuli if występuje przypisanie zamiast porównania.
  4. Instrukcje wewnątrz sekcji if oraz else powinny być zamienione miejscami.
CKE, E.14, czerwiec 2019, zadanie 31 · CKE, E.14, styczeń 2017, zadanie 40 (bank pytań, przedmiot strony, temat javascript)
Ćwiczenie przy komputerze · 20 minut

Ćwiczenie: porównania i warunek złożony

  1. Otwórz swój plik script.js (ten sam, w którym pracowaliście na poprzedniej lekcji).
  2. Dopisz let x = "5"; i let y = 5;, wypisz w konsoli x == y oraz x === y.
  3. Zadeklaruj let age = 20; i let hasIdCard = true;, wypisz w konsoli age >= 18 && hasIdCard.
  4. Zmień age na 16 i sprawdź wynik jeszcze raz - zobaczysz, że && wymaga prawdy z obu stron.
  5. Zapisz plik, odśwież page.html w przeglądarce i sprawdź wynik w konsoli (F12 → Console).
  6. Dla chętnych: zapisz zmiany w swoim repozytorium - commit „Dodaje porównania i operatory logiczne”.
Na koniec

Sprawdź się

  1. Czym różni się == od ===?
  2. Kiedy wyrażenie z && zwraca true?
  3. Jaki błąd kryje się w warunku if (x = y)?

Na następnej lekcji: instrukcje warunkowe if, else i else if.

Poza szkołą

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
== i != (dopuszczają różne typy)ESLint, reguła eqeqeq, wymusza === i !== - eliminuje niespodzianki przy zamianie typu.narzędzia
if (x = y) zamiast if (x == y)ESLint, reguła no-cond-assign, blokuje przypisanie wewnątrz warunku if.narzędzia
&& i || liczone ręcznie na kartceKrótkie spięcie (short-circuit): user && user.name sprawdza, czy user istnieje, zanim odczyta jego pole - częsty wzorzec w kodzie produkcyjnym.nadal w użyciu
Warunek złożony age >= 18 && hasIdCardTen sam wzorzec waliduje formularze rejestracji: np. age >= 18 && consent === true.nadal w użyciu
ESLint, reguła eqeqeq (eslint.org/docs/latest/rules/eqeqeq) · ESLint, reguła no-cond-assign (eslint.org/docs/latest/rules/no-cond-assign)