Przejdź do treści

Temat 02 · 2 × 45 minINF.03

Zmienne i typy danych

Każdy skrypt coś pamięta: cenę z pola formularza, liczbę kliknięć, imię użytkownika, to, czy checkbox jest zaznaczony. Miejsca na te wartości to zmienne, a rodzaje wartości to typy danych. W tej lekcji nauczysz się deklarować zmienne trzema słowami kluczowymi (i wiedzieć, którego używać), nadawać im nazwy, za które egzaminator daje punkt, oraz rozpoznawać typ wartości – bo od typu zależy, czy + doda, czy sklei.

Zmienna to karteczka z nazwą

Zmienna to nazwa, pod którą program przechowuje wartość. Deklarujesz ją słowem let, podajesz nazwę i – zwykle od razu – wartość:

pierwsza-zmienna.js
let cena = 120;
console.log(cena);
console.log(cena * 2);
cena = 150;            // nowa wartość pod tą samą nazwą
console.log(cena);
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Wygodna metafora: zmienna to żółta karteczka z nazwą, przyklejona do wartości. let cena = 120 przykleja karteczkę „cena” do liczby 120. cena = 150 odkleja ją od 120 i przykleja do 150. Stara wartość zostaje bez nazwy i przeglądarka ją sprząta. Ta metafora jest lepsza niż „pudełko”, bo dwie karteczki mogą wisieć na tej samej wartości – przyda się to, gdy poznasz tablice i obiekty.

Po lewej trzy wartości: 120, napis Ola i true, do każdej przyklejona karteczka z nazwą: cena, imie, zalogowany. Po prawej po instrukcji cena = 150 karteczka cena wisi na nowej wartości 150, a stara wartość 120 zostaje bez nazwy.
Rys. 1. Przypisanie nie zmienia wartości – przekleja karteczkę z nazwą na inną wartość.

Słownictwo, które będzie wracać:

  • deklaracja – utworzenie zmiennej: let cena;
  • inicjalizacja – pierwsze nadanie wartości: let cena = 120; (deklaracja i inicjalizacja w jednym),
  • przypisanie – zapisanie wartości znakiem =: cena = 150;. Jeden znak = to zawsze „zapisz”, nigdy „czy równe” – porównania mają == i === (lekcja Porównania i warunki).

Zmienna zadeklarowana bez wartości ma specjalną wartość undefined („nieokreślona”):

bez-wartosci.js
let liczbaKlikniec;
console.log(liczbaKlikniec);
liczbaKlikniec = 0;
console.log(liczbaKlikniec);
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

let, const i var

JavaScript ma trzy słowa do deklarowania zmiennych. Współczesny kod używa dwóch pierwszych; trzecie musisz znać, bo zadania egzaminacyjne są w nim napisane.

SłowoMożna zmienić wartość?Można zadeklarować drugi raz?ZasięgKiedy używać
constnienieblok { }domyślnie – gdy wartość nie będzie zmieniana
lettaknieblok { }gdy wartość będzie się zmieniać (licznik, suma, indeks)
vartaktakfunkcjatylko czytanie starszego kodu i arkuszy CKE

const – stała

const deklaruje zmienną, do której nie można przypisać nowej wartości. Trzeba ją od razu zainicjalizować. Używaj jej domyślnie: większość wartości w skrypcie (cena za sztukę, stawka VAT, znaleziony element strony) nie zmienia się po ustaleniu, a const chroni cię przed przypadkowym nadpisaniem.

const.js
const stawkaVat = 0.23;
console.log("VAT:", stawkaVat);
stawkaVat = 0.08;      // TypeError: Assignment to constant variable.
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

let – zmienna

Gdy wartość ma się zmieniać – licznik kliknięć, suma zamówienia, numer aktualnego zdjęcia w galerii – użyj let. Zasada praktyczna: zacznij od const, a jeśli edytor podkreśli ci przypisanie, zmień na let.

let.js
let suma = 0;
suma = suma + 45;      // zabieg 1
suma = suma + 30;      // zabieg 2
console.log("Do zapłaty:", suma, "zł");
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

var – dialekt egzaminacyjny

Przed 2015 rokiem var był jedynym sposobem deklaracji. Działa, ale ma dwie cechy, które w większym kodzie prowadzą do błędów: pozwala zadeklarować tę samą zmienną drugi raz (literówka zamiast błędu daje cichy bałagan) i ignoruje bloki – zmienna z var wewnątrz if czy pętli „wycieka” poza klamry.

Sprawdź się

Co się stanie po uruchomieniu tego kodu?

let liczba = 5;
let liczba = 10;
console.log(liczba);
let-redeklaracja.js
let liczba = 5;
let liczba = 10;       // SyntaxError: Identifier 'liczba' has already been declared
console.log(liczba);
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik
var-redeklaracja.js
var liczba = 5;
var liczba = 10;       // var na to pozwala – bez ostrzeżenia
console.log(liczba);
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Różnica zasięgu, w skrócie (dokładnie: lekcja Zasięg, hoisting, domknięcia):

zasieg.js
if (true) {
  var starySposob = "widoczne poza blokiem";
  let nowySposob = "widoczne tylko w bloku";
  console.log(nowySposob);
}
console.log(starySposob);
console.log(typeof nowySposob);  // "undefined" – poza blokiem ta zmienna nie istnieje
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Nazwy zmiennych

Reguły, których pilnuje przeglądarka:

  • nazwa składa się z liter, cyfr, _ i $, ale nie może zaczynać się cyfrą: cena2 tak, 2cena nie,
  • bez spacji i myślników: cena-brutto to odejmowanie cena - brutto,
  • wielkość liter ma znaczenie: Cena, cena i CENA to trzy różne zmienne,
  • nie wolno użyć słów kluczowych języka: let, const, if, for, function, class, return, new…

Reguły, których pilnuje egzaminator i każdy, kto czyta twój kod:

  • nazwa mówi, co zmienna przechowuje: cenaZaKg, liczbaRat, wybraneMiasto, czyZaznaczony. Nazwy a, x1, zm, temp to od 2024 roku strata osobnego kryterium „znaczące nazewnictwo zmiennych i funkcji w języku polskim lub angielskim”,
  • zapis camelCase: pierwsze słowo małą literą, każde następne wielką: kosztCalkowity, totalCost,
  • bez polskich znaków w nazwach: kosztCalkowity, nie kosztCałkowity. Przeglądarka by to przyjęła, ale literówki typu ł/l są niewidoczne, a na obcym komputerze kodowanie może zawieść. Polskie znaki trzymaj w napisach i komentarzach,
  • po polsku albo po angielsku – ale konsekwentnie w całym skrypcie.
nazwy.js
// dobrze: od razu wiadomo, co jest czym
const cenaZaKg = 12.5;
const wagaKg = 3;
const kosztCalkowity = cenaZaKg * wagaKg;
console.log("Koszt:", kosztCalkowity, "zł");

// źle (działa, ale egzaminator odejmie punkt za nazewnictwo):
const a = 12.5;
const b = 3;
const c = a * b;
console.log(c);
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik
Sprawdź się

Która nazwa zmiennej jest poprawna składniowo w JavaScripcie?

Typy danych

Każda wartość w JavaScripcie ma typ. Typ decyduje, co można z wartością zrobić: liczby dodajesz, napisy sklejasz, wartości logiczne sprawdzasz w warunku. Na początek potrzebujesz pięciu typów prostych; dwa pozostałe proste (bigint, symbol) są rzadkie, a typ złożony object (w tym tablice i funkcje) ma własne lekcje.

Typy proste (prymitywne)
stringnumberbooleanundefinednullbigintsymbol
jedna wartość, kopiowana przy przypisaniu
Typ złożony
objectArrayFunction
lekcje 8, 9 i 24
Rys. 2. Typy danych w JavaScripcie. W tej lekcji: pięć pierwszych typów prostych.

string – napis

Tekst w cudzysłowach "…", apostrofach '…' albo odwrotnych apostrofach `…` (szablony, lekcja Napisy). Napisem jest wszystko, co stoi w cudzysłowach – także "120" i "true".

string.js
const imie = "Ola";
const miasto = 'Gdańsk';
const kodPocztowy = "80-001";   // to napis, nie liczba – bo w cudzysłowach
console.log(imie, miasto, kodPocztowy);
console.log("Ala" + "Nowak");   // + dla napisów = sklejanie (konkatenacja)
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

number – liczba

JavaScript ma jeden typ liczbowy dla całkowitych i ułamkowych. Separator dziesiętny to zawsze kropka, nigdy przecinek. Liczby piszesz bez cudzysłowów.

number.js
const liczbaRat = 12;
const cena = 19.99;
const temperatura = -4;
console.log(liczbaRat + cena);     // dodawanie
console.log(typeof liczbaRat, typeof cena);
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

boolean – wartość logiczna

Tylko dwie wartości: true (prawda) i false (fałsz), bez cudzysłowów. Powstają m.in. z porównań i ze stanu checkboxa (.checked).

boolean.js
const zalogowany = true;
const regulaminZaznaczony = false;
const czyDorosly = 17 >= 18;        // porównanie daje boolean
console.log(zalogowany, regulaminZaznaczony, czyDorosly);
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

undefined – „nic nie przypisano”

Wartość zmiennej zadeklarowanej bez inicjalizacji, brakującego parametru funkcji czy nieistniejącej właściwości obiektu. Zwykle sygnał, że czegoś zabrakło.

null – „celowo puste”

Wartość, którą programista wpisuje sam, żeby powiedzieć „tu nie ma nic”. Zwraca ją też document.getElementById(...), gdy nie znajdzie elementu – stąd komunikat Cannot read properties of null.

undefined-null.js
let wybranyKurs;              // jeszcze nic nie wybrano
let znalezionyElement = null; // celowo: niczego nie ma
console.log(wybranyKurs, znalezionyElement);
console.log(wybranyKurs === undefined, znalezionyElement === null);
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Operator typeof

typeof wartość zwraca napis z nazwą typu. Przydaje się w konsoli, gdy nie wiesz, co dostałeś – zwłaszcza z formularza.

Sprawdź się

Co wypisze ten kod?

var x = "true";
console.log(typeof x);
typeof.js
console.log(typeof "Ola");       // string
console.log(typeof "true");      // string – bo w cudzysłowach!
console.log(typeof 42);          // number
console.log(typeof 4.2);         // number – jeden typ dla wszystkich liczb
console.log(typeof true);        // boolean
console.log(typeof undefined);   // undefined
console.log(typeof (5 > 3));     // boolean – typ wyniku porównania
console.log(typeof typeof 5);    // string – bo typeof zawsze zwraca napis
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik
Wartośćtypeof zwraca
"tekst", "5", """string"
5, -2.5, NaN, Infinity"number"
true, false"boolean"
undefined, niezadeklarowana nazwa"undefined"
null"object" (błąd historyczny!)
{}, [], new Date()"object"
function () {}, console.log"function"
Sprawdź się

Co wypisze console.log(typeof null)?

Zmienna może zmienić typ

JavaScript jest językiem dynamicznie typowanym: typ należy do wartości, nie do zmiennej. Ta sama zmienna let może najpierw trzymać liczbę, a potem napis. To wygodne, ale bywa źródłem błędów, gdy z formularza dostajesz napis "5", a myślisz, że masz liczbę 5.

dynamiczne-typy.js
let dane = 5;
console.log(dane, typeof dane);
dane = "5";
console.log(dane, typeof dane);
dane = dane + 1;
console.log(dane, typeof dane);   // "51" – napis plus liczba to sklejenie
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Na egzaminie

Ściąga

SkładniaCo robiPrzykład
const nazwa = wartość;stała – bez ponownego przypisania, zasięg blokowyconst stawka = 0.23;
let nazwa = wartość;zmienna – można przypisać nową wartośćlet suma = 0; suma = 5;
let nazwa;deklaracja bez wartości → undefinedlet wybor;
var nazwa = wartość;stary zapis (arkusze CKE), zasięg funkcji, redeklaracja dozwolonavar x = 10;
nazwa = wartość;przypisanie (jeden =)cena = 150;
"…", '…'napis (string) – także "5" i "true"const kod = "80-001";
12, -3.5liczba (number), kropka dziesiętnaconst cena = 19.99;
true, falsewartość logiczna (boolean)const zgoda = true;
undefinedbrak wartości (nic nie przypisano)let x; // undefined
nullcelowo puste; też wynik nieznalezienia elementulet el = null;
typeof xnapis z nazwą typutypeof "5" // "string"
typeof null"object" – pułapkasprawdzaj x === null
camelCase, znaczące nazwykryterium egzaminu praktycznegoliczbaRat, kosztCalkowity

Zadania

Zadanie 1
łatwe

Karta pacjenta w konsoli

Zadeklaruj sześć zmiennych opisujących pacjenta, każda innego rodzaju: imię i nazwisko (napis), wiek (liczba całkowita), wzrost w metrach (liczba z ułamkiem), czy jest ubezpieczony (wartość logiczna), numer sali (jeszcze nieprzydzielony – undefined), uwagi lekarza (celowo puste – null). Użyj const tam, gdzie wartość nie będzie się zmieniać, i znaczących nazw. Wypisz każdą zmienną w osobnej linii w formacie opis: wartość (typ), np. Wiek: 17 (number).

Pokaż rozwiązanie
karta-pacjenta.js
// Dane pacjenta – const, bo w tym skrypcie ich nie zmieniamy
const imieNazwisko = "Ola Nowak";
const wiek = 17;
const wzrostM = 1.68;
const ubezpieczony = true;
let numerSali;             // jeszcze nie przydzielono – undefined
let uwagiLekarza = null;   // celowo puste

console.log("Pacjent:", imieNazwisko, "(" + typeof imieNazwisko + ")");
console.log("Wiek:", wiek, "(" + typeof wiek + ")");
console.log("Wzrost:", wzrostM, "(" + typeof wzrostM + ")");
console.log("Ubezpieczony:", ubezpieczony, "(" + typeof ubezpieczony + ")");
console.log("Sala:", numerSali, "(" + typeof numerSali + ")");
console.log("Uwagi:", uwagiLekarza, "(" + typeof uwagiLekarza + ")");
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Zwróć uwagę na ostatnią linię: typeof null to object. Numer sali i uwagi są w let, bo w prawdziwym programie dostaną później wartość.

Zadanie 2
łatwe

Popraw deklaracje

Każda z poniższych linii zawiera błąd albo złą praktykę. Popraw je tak, by kod działał i spełniał kryterium znaczącego nazewnictwa. Zapisz w komentarzu, co było nie tak.

do-poprawy.js
const liczba rat = 12;
let 1cena = 4500;
const miasto;
var x = "Katowice";
let suma = 0;
let suma = suma + 100;
const czyZgoda = "true";
Pokaż rozwiązanie
poprawione.js
// 1. spacja w nazwie → camelCase
const liczbaRat = 12;
// 2. nazwa nie może zaczynać się cyfrą
let cena = 4500;
// 3. const wymaga wartości od razu
const miasto = "Katowice";
// 4. var x – nieznacząca nazwa i stary zapis; miasto już mamy wyżej
// 5–6. druga deklaracja let tej samej nazwy to SyntaxError – samo przypisanie
let suma = 0;
suma = suma + 100;
// 7. "true" w cudzysłowach to napis; wartość logiczna jest bez cudzysłowów
const czyZgoda = true;

console.log(liczbaRat, cena, miasto, suma, czyZgoda, typeof czyZgoda);
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik
Zadanie 3
średnie

Przewidź typ

Zanim uruchomisz, zapisz obok każdej linii, co wypisze typeof. Potem uruchom i policz trafienia. Za każdą pomyłkę wróć do tabeli z sekcji „Operator typeof” i znajdź regułę.

przewidz-typ.js
console.log(typeof 42);
console.log(typeof "42");
console.log(typeof (42 > 40));
console.log(typeof null);
console.log(typeof undefined);
console.log(typeof nieZadeklarowana);
console.log(typeof typeof 42);
console.log(typeof 42.0);
console.log(typeof "");
console.log(typeof (1 + "1"));
Pokaż rozwiązanie
przewidz-typ.js
console.log(typeof 42);             // number
console.log(typeof "42");           // string – cudzysłowy
console.log(typeof (42 > 40));      // boolean – wynik porównania
console.log(typeof null);           // object – pułapka historyczna
console.log(typeof undefined);      // undefined
console.log(typeof nieZadeklarowana); // undefined – typeof nie zgłasza błędu dla nieistniejącej nazwy
console.log(typeof typeof 42);      // string – typeof zwraca napis
console.log(typeof 42.0);           // number – jeden typ liczbowy
console.log(typeof "");             // string – pusty napis to nadal napis
console.log(typeof (1 + "1"));      // string – liczba + napis = sklejenie "11"
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Linia 6 jest wyjątkiem od reguły z lekcji 1: typeof to jedyna operacja, która dla niezadeklarowanej nazwy nie rzuca ReferenceError, lecz zwraca "undefined".

Zadanie 4
średnie

Z dialektu egzaminacyjnego na współczesny JS

Poniższy fragment jest napisany tak, jak w arkuszach CKE. Przepisz go we współczesnym stylu: const/let zamiast var i zmiennych bez deklaracji, znaczące nazwy w camelCase. Wynik w konsoli ma być identyczny. Następnie odpowiedz: która zmienna powinna być const, a która let, i dlaczego?

dialekt.js
var a = 5000;
var b = 3000;
r = 10;
var s = a + b;
var w = s / r;
console.log("Koszt: " + s + " zl, rata: " + w + " zl");
Pokaż rozwiązanie
wspolczesny.js
const cenaKursuReact = 5000;      // const – cena z cennika się nie zmienia
const cenaKursuJs = 3000;
const liczbaRat = 10;             // const – w tym skrypcie stała; z formularza byłaby let
const kosztCalkowity = cenaKursuReact + cenaKursuJs;
const rata = kosztCalkowity / liczbaRat;
console.log("Koszt: " + kosztCalkowity + " zl, rata: " + rata + " zl");
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Wszystkie wartości są obliczane raz i nieprzypisywane ponownie, więc wszystkie mogą być const. let byłby potrzebny, gdyby np. kosztCalkowity rósł w kolejnych krokach (kosztCalkowity = kosztCalkowity + …). Oryginał z r = 10; bez deklaracji działa tylko dlatego, że JavaScript po cichu tworzy zmienną globalną – w twoim kodzie to zawsze const lub let.

Zadanie 5
trudnejak na INF.03

Dane do kalkulatora rat

To fragment zadania w stylu arkusza ze stycznia 2025 (INF.03-01-25.01), ograniczony do tego, co już umiesz – bez formularza i bez obliczeń z konwersją. Napisz skrypt raty.js, który:

  • przechowuje w stałych o znaczących nazwach: cenę kursu React.js (5000), cenę kursu JavaScript (3000), liczbę rat (10) i miasto ("Warszawa"),
  • przechowuje w zmiennych logicznych, czy każdy z dwóch kursów jest wybrany (na razie wpisz true dla React i false dla JavaScript – w lekcji o kontrolkach te wartości przyjdą z checkboxów),
  • wypisuje w konsoli dwie linie: Miasto: Warszawa (string) i Kurs React wybrany: true (boolean) – nazwę typu uzyskaj przez typeof, nie wpisuj jej ręcznie,
  • jest poprzedzony komentarzem z opisem zadania.

Kryteria oceny (zero-jedynkowe):

  1. Skrypt jest w języku JavaScript i zawiera co najmniej jedną poprawną składniowo instrukcję.
  2. Ceny, liczba rat i miasto są zadeklarowane przez const, wartości logiczne przez let lub const, bez var i bez zmiennych niezadeklarowanych.
  3. Ceny i liczba rat są liczbami (nie napisami), miasto jest napisem, wybory są wartościami logicznymi – sprawdzane przez typeof w konsoli.
  4. Konsola zawiera dokładnie dwie linie o podanej treści.
  5. Nazwy zmiennych są znaczące, w języku polskim lub angielskim, zapisane w camelCase.
  6. Skrypt zawiera komentarz.
Pokaż rozwiązanie
raty.js
// Kalkulator rat – dane wejściowe (lekcja 2: tylko zmienne i typy)
const cenaReact = 5000;        // number
const cenaJavaScript = 3000;   // number
const liczbaRat = 10;          // number
const miasto = "Warszawa";     // string

let reactWybrany = true;       // boolean – w lekcji 13 przyjdzie z checkbox.checked
let javaScriptWybrany = false; // boolean

console.log("Miasto: " + miasto + " (" + typeof miasto + ")");
console.log("Kurs React wybrany: " + reactWybrany + " (" + typeof reactWybrany + ")");
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Samokontrola jak egzaminator: kryterium 3 sprawdzasz, dopisując tymczasowo console.log(typeof cenaReact) – ma być number. Gdybyś napisał const cenaReact = "5000";, wypisałoby string, a w kolejnej lekcji "5000" + "3000" dałoby "50003000" zamiast 8000.

Test powtórkowy

Test powtórkowy

Format jak w części pisemnej INF.03: 4 odpowiedzi, 1 poprawna. Dwa pytania w dialekcie egzaminacyjnym.

0/0poprawnych
Sprawdź się

Instrukcja var x = 'true'; tworzy zmienną typu

Sprawdź się

Który zapis deklaruje zmienną, której wartości nie będzie można później zmienić?

Sprawdź się

Jaką wartość ma zmienna wynik po wykonaniu tego kodu?

var wynik;
console.log(wynik);
Sprawdź się

Co wypisze poniższy kod?

let cena = 100;
cena = 120;
console.log(cena);
Sprawdź się

Która z nazw zmiennych jest niepoprawna składniowo?

Sprawdź się

Co wypisze console.log(typeof 3.14)?

Sprawdź się

Zmienna wynikKonwersji ma wartość null. Które sprawdzenie poprawnie to wykryje?

Sprawdź się

Zgodnie z zasadami oceniania zadań praktycznych INF.03 od 2024 roku osobne kryterium dotyczy

Sprawdź się

Co wypisze poniższy kod?

let dane = 7;
dane = "siedem";
console.log(typeof dane);
Sprawdź się

Dlaczego poniższy kod zgłosi błąd?

console.log(rabat);
let rabat = 10;