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.

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.

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).

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.

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.