Lekcja 3: Operatory
Operatory w JavaScript to specjalne symbole lub słowa kluczowe, które wykonują operacje na wartościach (operandach). W tej lekcji przyjrzymy się różnym typom operatorów dostępnych w JavaScript.
Operatory arytmetyczne
Służą do wykonywania podstawowych operacji matematycznych.
+
(Dodawanie)-
(Odejmowanie)*
(Mnożenie)/
(Dzielenie)%
(Modulo - reszta z dzielenia)**
(Potęgowanie - ES6)++
(Inkrementacja - zwiększenie o 1)--
(Dekrementacja - zmniejszenie o 1)
let a = 10;
let b = 3;
console.log(a + b); // 13
console.log(a - b); // 7
console.log(a * b); // 30
console.log(a / b); // 3.333...
console.log(a % b); // 1 (reszta z 10 / 3)
console.log(a ** b); // 1000 (10 do potęgi 3)
let c = 5;
c++; // c staje się 6 (post-inkrementacja)
console.log(c); // 6
let d = 8;
--d; // d staje się 7 (pre-dekrementacja)
console.log(d); // 7
Uwaga: Operator +
służy również do konkatenacji (łączenia) stringów.
let tekst1 = "Witaj, ";
let tekst2 = "świecie!";
console.log(tekst1 + tekst2); // "Witaj, świecie!"
console.log("Liczba: " + 5); // "Liczba: 5" (liczba jest konwertowana na string)
Operatory przypisania
Służą do przypisywania wartości do zmiennych.
=
(Przypisanie)+=
(Dodaj i przypisz)-=
(Odejmij i przypisz)*=
(Pomnóż i przypisz)/=
(Podziel i przypisz)%=
(Modulo i przypisz)**=
(Potęguj i przypisz)
let x = 10;
x += 5; // x = x + 5; (x staje się 15)
x -= 3; // x = x - 3; (x staje się 12)
x *= 2; // x = x * 2; (x staje się 24)
x /= 4; // x = x / 4; (x staje się 6)
x %= 5; // x = x % 5; (x staje się 1)
x **= 3; // x = x ** 3; (x staje się 1)
console.log(x); // 1
Operatory porównania
Służą do porównywania dwóch wartości, zwracają wartość logiczną (true
lub false
).
==
(Równość - porównuje wartości po konwersji typów)!=
(Nierówność - porównuje wartości po konwersji typów)===
(Identyczność - porównuje wartości i typy, bez konwersji)!==
(Nieidentyczność - porównuje wartości i typy, bez konwersji)>
(Większe niż)<
(Mniejsze niż)>=
(Większe lub równe)<=
(Mniejsze lub równe)
let num = 5;
let str = "5";
console.log(num == str); // true (wartości są równe po konwersji str na number)
console.log(num === str); // false (typy są różne: number vs string)
console.log(num != str); // false
console.log(num !== str); // true
console.log(10 > 5); // true
console.log(10 < 5); // false
console.log(10 >= 10); // true
console.log(10 <= 5); // false
Zalecenie: Zawsze używaj operatorów ===
i !==
zamiast ==
i !=
, aby uniknąć nieoczekiwanych wyników związanych z automatyczną konwersją typów.
Operatory logiczne
Służą do łączenia wyrażeń logicznych.
&&
(Logiczne AND - "i") - zwracatrue
, jeśli oba operandy są prawdziwe||
(Logiczne OR - "lub") - zwracatrue
, jeśli przynajmniej jeden operand jest prawdziwy!
(Logiczne NOT - "nie") - odwraca wartość logiczną operandu
let a = true;
let b = false;
console.log(a && b); // false
console.log(a || b); // true
console.log(!a); // false
console.log(!b); // true
// Przykład z wartościami nie-logicznymi (wykorzystanie "truthy" i "falsy")
console.log(5 && "hello"); // "hello" (zwraca ostatnią wartość "truthy")
console.log(0 && "hello"); // 0 (zwraca pierwszą wartość "falsy")
console.log(null || "world"); // "world" (zwraca pierwszą wartość "truthy")
console.log(undefined || 0); // 0 (zwraca ostatnią wartość "falsy", jeśli obie są "falsy")
Operator warunkowy (trójargumentowy)
Skrócona forma instrukcji if...else
.
warunek ? wartosc_jesli_prawda : wartosc_jesli_falsz
let wiek = 20;
let status = (wiek >= 18) ? "Pełnoletni" : "Niepełnoletni";
console.log(status); // "Pełnoletni"
Operator typeof
Zwraca typ operandu jako string (omówiony w poprzedniej lekcji).
console.log(typeof 42); // "number"
console.log(typeof "hello"); // "string"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object" (znany błąd)
console.log(typeof {}); // "object"
console.log(typeof []); // "object"
console.log(typeof function(){}); // "function"
Kolejność wykonywania operatorów
Operatory mają określoną kolejność wykonywania (priorytet). Na przykład mnożenie i dzielenie są wykonywane przed dodawaniem i odejmowaniem. Można używać nawiasów ()
, aby zmienić kolejność wykonywania.
let wynik = 5 + 3 * 2; // Najpierw mnożenie: 3 * 2 = 6, potem dodawanie: 5 + 6 = 11
console.log(wynik); // 11
let wynik2 = (5 + 3) * 2; // Najpierw dodawanie w nawiasach: 5 + 3 = 8, potem mnożenie: 8 * 2 = 16
console.log(wynik2); // 16
Zadanie praktyczne
Napisz skrypt, który oblicza pole i obwód prostokąta o bokach a = 5
i b = 8
. Użyj odpowiednich operatorów arytmetycznych i przypisania. Wyświetl wyniki w konsoli.
Pokaż rozwiązanie
let a = 5;
let b = 8;
let pole = a * b;
let obwod = 2 * (a + b); // Można też: 2 * a + 2 * b
console.log("Bok a:", a);
console.log("Bok b:", b);
console.log("Pole prostokąta:", pole);
console.log("Obwód prostokąta:", obwod);
Zadanie do samodzielnego wykonania
Napisz skrypt, który sprawdza, czy dana liczba x
jest parzysta i dodatnia. Użyj operatorów porównania i logicznych. Przetestuj dla x = 10
, x = 7
i x = -4
. Wyświetl wynik (true
lub false
) w konsoli dla każdego przypadku.
FAQ - Operatory
Jaka jest różnica między `++i` a `i++`?
Oba operatory zwiększają wartość zmiennej i
o 1. Różnica pojawia się, gdy używamy ich w wyrażeniu. ++i
(pre-inkrementacja) najpierw zwiększa i
, a potem zwraca nową wartość. i++
(post-inkrementacja) najpierw zwraca oryginalną wartość i
, a dopiero potem ją zwiększa.
Czy `==` jest kiedykolwiek użyteczny?
Chociaż zaleca się używanie ===
, operator ==
może być przydatny w specyficznych sytuacjach, np. gdy chcemy sprawdzić, czy zmienna jest null
lub undefined
za jednym razem (zmienna == null
zwróci true
dla obu). Jednak dla przejrzystości kodu często lepiej jest jawnie sprawdzać oba przypadki.
Co zwracają operatory logiczne `&&` i `||`?
W przeciwieństwie do niektórych języków, operatory te nie zawsze zwracają true
lub false
. Zwracają wartość jednego z operandów. &&
zwraca pierwszy operand, jeśli jest "falsy", w przeciwnym razie zwraca drugi. ||
zwraca pierwszy operand, jeśli jest "truthy", w przeciwnym razie zwraca drugi.
Do czego służy operator modulo `%`?
Operator modulo zwraca resztę z dzielenia. Jest bardzo użyteczny, na przykład do sprawdzania parzystości liczby (liczba % 2 === 0
), cyklicznego przechodzenia przez elementy (np. w animacjach) lub konwersji jednostek (np. sekund na minuty i sekundy).
Czy mogę łączyć operatory przypisania?
Tak, operatory przypisania można łączyć, ale należy to robić ostrożnie, ponieważ może to zmniejszyć czytelność kodu. Na przykład a = b = 10;
przypisze wartość 10 zarówno do zmiennej b
, jak i a
. Przypisanie odbywa się od prawej do lewej.
Jak działa operator `**` (potęgowanie)?
Operator potęgowania **
, wprowadzony w ES6, podnosi lewy operand do potęgi prawego operandu. Na przykład 2 ** 3
jest równoważne Math.pow(2, 3)
i zwraca 8. Jest to bardziej zwięzły sposób zapisu operacji potęgowania.