JavaScript: tablice, obiekty i biblioteki wbudowane

INF.03 · teoria
autor: redakcja · 09.09.2026
Tablice w JavaScripcie: indeksy od zera, length, push, pop, splice, indexOf, join, sort i forEach, obiekt jako zbiór par klucz i wartość oraz biblioteki String, Math i Date z pułapką sortowania liczb i miesięcy liczonych od zera. Lekcja 11.5 kursu INF.03.
Ta­bli­ca to zmien­na trzy­ma­ją­ca wiele war­to­ści pod jedną nazwą, każdą pod wła­snym nu­me­rem, a obiekt to zbiór par klucz i war­tość, w którym za­miast numeru stoi nazwa. Oba są typami zło­żo­ny­mi, więc jedna nazwa koszyk wy­star­cza na całą listę to­wa­rów za­miast pięciu osob­nych zmien­nych. W części pi­sem­nej wra­ca­ją py­ta­nia o ele­ment o po­da­nym in­dek­sie, o po­praw­ny zapis two­rzą­cy ta­bli­cę, o to, co wy­pi­sze skrypt po push albo sort, oraz o metody bi­blio­tek String, Math i Date. W za­da­niu prak­tycz­nym z ta­bli­cy ge­ne­ru­je się listę <li>, a Math i Date liczą war­tość wsta­wia­ną potem do wska­za­ne­go ele­men­tu strony.

Ta­bli­ca: zapis, in­dek­sy i dłu­gość

Indeks to numer po­zy­cji, pod którą ele­ment leży w ta­bli­cy, li­czo­ny zawsze od zera: pierw­szy ele­ment ma indeks 0, drugi 1, a ostat­ni o jeden mniej niż liczba ele­men­tów. Ta­bli­cę tworzy się na­wia­sa­mi kwa­dra­to­wy­mi z war­to­ścia­mi po prze­cin­ku albo kon­struk­to­rem new Array() (NOWA TABLICA); oba zapisy dzia­ła­ją tak samo i oba stoją w ar­ku­szach. Ele­men­ty nie muszą być jed­ne­go typu: w jednej ta­bli­cy mogą leżeć liczby, napisy i war­to­ści lo­gicz­ne.
1
2
3
4
5
const ceny = [120, 45, 650];
const sprzet = new Array("mysz", "monitor", "klawiatura");
console.log(ceny[0]);
console.log(ceny.length);
console.log(ceny[ceny.length - 1]);
1
2
3
120
3
650
length (DŁUGOŚĆ) to liczba ele­men­tów, a nie naj­więk­szy indeks, więc ostat­ni ele­ment stoi pod length minus jeden. Od­wo­ła­nie do nie­ist­nie­ją­ce­go in­dek­su nie zgła­sza błędu, tylko oddaje undefined (NIEOKREŚLONA). Przy­pi­sa­nie pod nowy indeks do­kła­da ele­ment, a const (STAŁA) przy ta­bli­cy blo­ku­je wy­łącz­nie pod­mia­nę całej ta­bli­cy, nie zmianę jej za­war­to­ści. Star­sze ar­ku­sze de­kla­ru­ją ta­bli­ce słowem var, na przy­kład var liczby = [1, 2, 3];, i działa to tak samo.
Pu­łap­ka: new Array[1, 2, 3] jest błędem skład­ni, bo kon­struk­tor wy­wo­łu­je się na­wia­sa­mi okrą­gły­mi. new Array(5) z jedną liczbą daje pustą ta­bli­cę o dłu­go­ści 5, a nie ta­bli­cę z jedną piątką.

Do­da­wa­nie, usu­wa­nie i szu­ka­nie ele­men­tów

Metoda to funk­cja przy­pi­sa­na do obiek­tu, wy­wo­ły­wa­na po kropce za jego nazwą. Ta­bli­ca ma kom­plet metod do zmiany za­war­to­ści i każda z nich pra­cu­je na ta­bli­cy, na której ją wy­wo­ła­no.
Metoda
Co robi
Co zwraca
push("x")
do­kła­da ele­ment na koniec
nową dłu­gość ta­bli­cy
pop()
za­bie­ra ostat­ni ele­ment
za­bra­ny ele­ment
unshift("x")
do­kła­da ele­ment na po­czą­tek
nową dłu­gość ta­bli­cy
shift()
za­bie­ra pierw­szy ele­ment
za­bra­ny ele­ment
splice(1, 2)
usuwa 2 ele­men­ty od in­dek­su 1
ta­bli­cę usu­nię­tych
indexOf("x")
szuka war­to­ści
indeks albo minus 1
join(", ")
skleja ele­men­ty w napis
gotowy napis
1
2
3
4
5
6
7
const lista = ["mleko", "chleb"];
lista.push("ser");
lista.unshift("woda");
console.log(lista.join(", "));
console.log(lista.pop());
console.log(lista.shift());
console.log(lista.length);
1
2
3
4
woda, mleko, chleb, ser
ser
woda
2
push (WEPCHNIJ) i pop (WYPCHNIJ) pra­cu­ją na końcu ta­bli­cy, unshift i shift na jej po­cząt­ku, więc prze­su­wa­ją in­dek­sy po­zo­sta­łych ele­men­tów. join (POŁĄCZ) skleja ele­men­ty w jeden napis, wsta­wia­jąc między nie podany se­pa­ra­tor; bez ar­gu­men­tu wsta­wia prze­ci­nek. splice (WYTNIJ) bierze indeks po­cząt­ku, liczbę ele­men­tów do usu­nię­cia i opcjo­nal­nie war­to­ści do wsta­wie­nia w to miej­sce, więc jedną metodą wycina się ze środka i wsta­wia do środka.
1
2
3
4
5
const dni = ["pon", "wt", "sr", "czw"];
dni.splice(1, 2);
console.log(dni.join(" "));
dni.splice(1, 0, "wt");
console.log(dni.join(" "));
1
2
pon czw
pon wt czw
indexOf (INDEKS OD) oddaje indeks pierw­sze­go wy­stą­pie­nia szu­ka­nej war­to­ści, a gdy jej nie ma, oddaje minus jeden. Obec­ność spraw­dza się więc po­rów­na­niem if (kolory.indexOf("bialy")!== -1), bo zero jest po­praw­nym in­dek­sem i samo w wa­run­ku za­cho­wa­ło­by się jak fałsz.
1
2
3
const kolory = ["czarny", "zielony", "bialy"];
console.log(kolory.indexOf("zielony"));
console.log(kolory.indexOf("czerwony"));
1
2
1
-1

Przej­ście po ta­bli­cy, sor­to­wa­nie i od­wra­ca­nie

Przej­ście po ta­bli­cy to wy­ko­na­nie tego samego kodu dla każ­de­go jej ele­men­tu po kolei. Kla­sycz­na pętla for (DLA) używa licz­ni­ka jako in­dek­su i kończy się na wa­run­ku i < tablica.length. Same pętle omawia lekcja o in­struk­cjach ste­ru­ją­cych.
[ JS ]
krok po kroku
skrypt
wierszy: 7
1
2
3
4
5
6
7
od nowa
❮ wstecz
dalej ❯
do końca
krok 0 z 16
start skryptu
ZMIENNE
jeszcze żadnej zmiennej
WYJŚCIE
skrypt jeszcze nic nie wypisał
Otwórz w interpreterze ›
1
2
20
4
Wa­ru­nek ze zna­kiem < za­trzy­mu­je pętlę na ostat­nim ele­men­cie; wersja z <= się­gnę­ła­by o jeden indeks za daleko i do­ło­ży­ła do sumy undefined. forEach (DLA KAŻDEGO) robi to samo bez licz­ni­ka: wy­ko­nu­je podaną funk­cję raz na każdy ele­ment, gdzie pierw­szy ar­gu­ment funk­cji to war­tość ele­men­tu, a drugi jego indeks. Funk­cjom po­świę­co­na jest osobna lekcja.
1
2
3
4
const produkty = ["Mysz", "Monitor", "Klawiatura"];
produkty.forEach(function (nazwa, indeks) {
console.log(indeks + ": " + nazwa);
});
1
2
3
0: Mysz
1: Monitor
2: Klawiatura
sort (SORTUJ) bez ar­gu­men­tu za­mie­nia ele­men­ty na napisy i po­rząd­ku­je je znak po znaku, więc liczby usta­wia al­fa­be­tycz­nie, a nie ro­sną­co. Po­rzą­dek licz­bo­wy daje do­pie­ro funk­cja po­rów­nu­ją­ca a - b dla ro­sną­ce­go i b - a dla ma­le­ją­ce­go. Kody z tej lekcji uru­cha­mia w prze­glą­dar­ce in­ter­pre­ter JavaScript.
[ JS ]
krok po kroku
skrypt
wierszy: 7
1
2
3
4
5
6
7
od nowa
❮ wstecz
dalej ❯
do końca
krok 0 z 17
start skryptu
ZMIENNE
jeszcze żadnej zmiennej
WYJŚCIE
skrypt jeszcze nic nie wypisał
Otwórz w interpreterze ›
1
2
100 12 45 5
5 12 45 100
Napis „100" wypadł przed „12", bo po wspól­nej je­dyn­ce zero stoi przed dwójką. Napisy sort po­rząd­ku­je al­fa­be­tycz­nie bez do­dat­ko­wej funk­cji, a reverse (ODWRÓĆ) od­wra­ca ko­lej­ność, więc razem dają po­rzą­dek ma­le­ją­cy.
1
2
3
4
5
const kolory = ["zielony", "czarny", "bialy"];
kolory.sort();
console.log(kolory.join(", "));
kolory.reverse();
console.log(kolory.join(", "));
1
2
bialy, czarny, zielony
zielony, czarny, bialy
Pu­łap­ka: sort i reverse prze­sta­wia­ją ele­men­ty w ta­bli­cy, na której je wy­wo­ła­no, za­miast od­da­wać prze­sta­wio­ną kopię. Po liczby.sort() pier­wot­na ko­lej­ność jest stra­co­na.

Obiekt: pary klucz i war­tość

Obiekt to zbiór na­zwa­nych war­to­ści, w którym każdą wska­zu­je klucz, czyli własna nazwa za­miast numeru. Za­pi­su­je się go w na­wia­sach klam­ro­wych, para po parze: klucz, dwu­kro­pek, war­tość, prze­ci­nek. Do war­to­ści sięga się kropką z nazwą klucza albo na­wia­sem kwa­dra­to­wym z klu­czem po­da­nym jako napis.
1
2
3
4
5
6
7
8
9
10
const produkt = {
nazwa: "Mysz bezprzewodowa",
cena: 89.99,
dostepny: true
};
console.log(produkt.nazwa);
console.log(produkt["cena"]);
produkt.cena = 79.99;
produkt.kolor = "czarny";
console.log(produkt.cena + " " + produkt.kolor);
1
2
3
Mysz bezprzewodowa
89.99
79.99 czarny
Nawias kwa­dra­to­wy po­tra­fi więcej niż kropka: przyj­mu­je klucz trzy­ma­ny w zmien­nej, jak produkt[pole], i klucz, który nie jest po­praw­ną nazwą, na przy­kład z od­stę­pem. Nowy klucz po­wsta­je przez samo przy­pi­sa­nie, a od­wo­ła­nie do nie­ist­nie­ją­ce­go oddaje undefined. W ar­ku­szach obiekt z klu­cza­mi tek­sto­wy­mi bywa na­zy­wa­ny ta­bli­cą aso­cja­cyj­ną: to ta sama kon­struk­cja co ta­bli­ca aso­cja­cyj­na w PHP, tylko za­pi­sa­na klam­ra­mi.
Dane strony sklepu mają zwykle kształt ta­bli­cy obiek­tów: jeden obiekt na pro­dukt.
1
2
3
4
5
6
7
8
9
10
const koszyk = [
{ nazwa: "Mysz", cena: 89 },
{ nazwa: "Monitor", cena: 650 }
];
let suma = 0;
koszyk.forEach(function (pozycja) {
suma += pozycja.cena;
});
console.log(koszyk[1].nazwa + ": " + koszyk[1].cena);
console.log("Razem: " + suma);
1
2
Monitor: 650
Razem: 739
Od­wo­ła­nie koszyk[1].nazwa czyta się od lewej: ele­ment o in­dek­sie 1, a z niego war­tość klucza nazwa. Za­mia­na ko­lej­no­ści na koszyk.nazwa[1] to błąd, bo ta­bli­ca nie ma klucza nazwa.

Bi­blio­te­ka String: ope­ra­cje na na­pi­sach

Bi­blio­te­ka wbu­do­wa­na to gotowy zbiór metod do­stęp­ny w każdej prze­glą­dar­ce, bez do­łą­cza­nia ja­kie­go­kol­wiek pliku. String (NAPIS) ob­słu­gu­je tekst: metody wy­wo­łu­je się po kropce za zmien­ną albo za samym na­pi­sem w cu­dzy­sło­wie, a znaki nu­me­ro­wa­ne są od zera, tak jak ele­men­ty ta­bli­cy.
1
2
3
4
5
6
const napis = "Powodzenia na egzaminie";
console.log(napis.length);
console.log(napis.toUpperCase());
console.log(napis.substring(2, 4));
console.log(napis.indexOf("na"));
console.log(napis.charAt(0));
1
2
3
4
5
23
POWODZENIA NA EGZAMINIE
wo
11
P
length napisu to liczba znaków razem z od­stę­pa­mi i jest wła­ści­wo­ścią, nie metodą, więc pisze się je bez na­wia­sów. substring wycina frag­ment od pierw­sze­go in­dek­su do dru­gie­go, przy czym znak spod dru­gie­go in­dek­su już nie wcho­dzi. slice wycina to samo, ale przyj­mu­je rów­nież in­dek­sy ujemne, li­czo­ne od końca: napis.slice(-9) daje egzaminie. charAt (ZNAK POD) oddaje po­je­dyn­czy znak spod po­da­ne­go in­dek­su, a indexOf szuka frag­men­tu w na­pi­sie i przy braku do­pa­so­wa­nia oddaje minus jeden, do­kład­nie jak w ta­bli­cy.
1
2
3
4
5
const dane = "mysz;monitor;klawiatura";
const czesci = dane.split(";");
console.log(czesci.length);
console.log(czesci[1]);
console.log(dane.replace("mysz", "MYSZ"));
1
2
3
3
monitor
MYSZ;monitor;klawiatura
split (PODZIEL) tnie napis na ta­bli­cę w miej­scach po­da­ne­go se­pa­ra­to­ra i jest od­wrot­no­ścią join, replace (ZASTĄP) pod­mie­nia pierw­sze wy­stą­pie­nie szu­ka­ne­go frag­men­tu, a toUpperCase za­mie­nia litery na wiel­kie.
Pu­łap­ka: metody napisu nie zmie­nia­ją napisu, tylko oddają nowy. Samo napis.toUpperCase(); nie daje żad­ne­go efektu, wynik trzeba przy­pi­sać albo od razu wy­pi­sać.

Bi­blio­te­ki Math i Date

Math (MATEMATYKA) to wbu­do­wa­na bi­blio­te­ka licz­bo­wa, której metody wy­wo­łu­je się wprost po nazwie, bez two­rze­nia obiek­tu. Wra­ca­ją w py­ta­niach o za­okrą­gla­nie i o lo­so­wa­nie.
1
2
3
4
console.log(Math.round(2.5), Math.round(2.4));
console.log(Math.floor(2.8), Math.ceil(2.1));
console.log(Math.abs(-7), Math.pow(2, 10), Math.sqrt(81));
console.log(Math.min(4, 9, 2), Math.max(4, 9, 2));
1
2
3
4
3 2
2 3
7 1024 9
2 9
round (ZAOKRĄGLIJ) idzie do naj­bliż­szej liczby cał­ko­wi­tej i po­łów­kę za­okrą­gla w górę, floor (PODŁOGA) zawsze w dół, a ceil (SUFIT) zawsze w górę. Dalej: abs to war­tość bez­względ­na, pow potęga o po­da­nej pod­sta­wie i wy­kład­ni­ku, sqrt pier­wia­stek kwa­dra­to­wy, a min i max naj­mniej­sza i naj­więk­sza z po­da­nych liczb.
1
2
3
4
const dol = 1;
const gora = 6;
const los = Math.floor(Math.random() * (gora - dol + 1)) + dol;
console.log(los >= dol && los <= gora);
Wynik: true, bo wy­lo­so­wa­na liczba zawsze mieści się w za­kre­sie od 1 do 6. Math.random() oddaje liczbę pseu­do­lo­so­wą od zera włącz­nie do je­dyn­ki wy­łącz­nie, więc samo z siebie nigdy nie da liczby cał­ko­wi­tej. Wzór na liczbę cał­ko­wi­tą z za­kre­su od dol do gora włącz­nie to Math.floor(Math.random() * (gora - dol + 1)) + dol; po­mi­nię­te + 1 odcina górną gra­ni­cę.
Date (DATA) to bi­blio­te­ka daty i czasu, której obiekt trzeba naj­pierw utwo­rzyć przez new Date(). Bez ar­gu­men­tów bierze bie­żą­cą datę i czas z kom­pu­te­ra, a z ar­gu­men­ta­mi rok, mie­siąc i dzień usta­wia datę wska­za­ną.
1
2
3
4
5
const data = new Date(2026, 4, 17);
console.log(data.getFullYear());
console.log(data.getMonth());
console.log(data.getDate());
console.log(data.getDay());
1
2
3
4
2026
4
17
0
Czwór­ka w drugim ar­gu­men­cie to maj, nie kwie­cień: sty­czeń ma numer 0, a gru­dzień 11, więc do wy­świe­tle­nia numeru mie­sią­ca dodaje się jeden. getFullYear oddaje pełny czte­ro­cy­fro­wy rok, getDate dzień mie­sią­ca, a getDay dzień ty­go­dnia jako numer li­czo­ny od nie­dzie­li, która ma zero: 17 maja 2026 wypada wła­śnie w nie­dzie­lę.
Pu­łap­ka: getMonth liczy mie­sią­ce od zera, a getFullYear i getDate liczą nor­mal­nie. getDate to dzień mie­sią­ca, getDay to dzień ty­go­dnia.

Na eg­za­mi­nie

Py­ta­nia pi­sem­ne o ta­bli­ce mają kilka sta­łych kształ­tów. Ramka z ta­bli­cą imion i py­ta­nie o od­wo­ła­nie do jednej war­to­ści: licz od zera, więc czwar­te imię stoi pod in­dek­sem 3, a zapis z samą war­to­ścią w na­wia­sie kwa­dra­to­wym od­wo­łu­je się do klucza, nie do numeru. Py­ta­nie o nie­po­praw­ny skła­dnio­wo zapis two­rzą­cy ta­bli­cę: kon­struk­tor bierze na­wia­sy okrą­głe, więc new Array[1, 2, 3] odpada, a [3] jest po­praw­ną ta­bli­cą jed­no­ele­men­to­wą. Py­ta­nie, do czego służy obiekt typu ta­bli­ca: do prze­cho­wy­wa­nia wielu war­to­ści do­wol­ne­go typu, nie tylko liczb i nie tylko na­pi­sów. Py­ta­nie o rodzaj przed­sta­wio­nej de­fi­ni­cji: nawias kwa­dra­to­wy to ta­bli­ca, a klamra z parami klucz i war­tość to obiekt, w ar­ku­szach na­zy­wa­ny też ta­bli­cą aso­cja­cyj­ną.
Bi­blio­te­ki wra­ca­ją w py­ta­niach o po­je­dyn­cze metody. Math.pow wy­zna­cza potęgę, Math.sqrt pier­wia­stek, Math.random liczbę pseu­do­lo­so­wą, a metodą, która dla 2.8 zwraca 2, jest Math.floor, bo round dałoby 3 tak samo jak ceil. Do obiek­tu Date należą getMonth i getDay, a nie concat ani pop. Frag­ment napisu między dwoma in­dek­sa­mi wycina slice albo substring, na­to­miast trim usuwa od­stę­py z brze­gów, concat skleja napisy, a zapis s = t.length; przy­pi­su­je dłu­gość napisu, nie jego frag­ment.
Naj­częst­sze py­ta­nie brzmi „co wy­świe­tli przed­sta­wio­ny skrypt" i roz­wią­zu­je się je zawsze tak samo: prze­pisz ta­bli­cę, wy­ko­naj metodę po me­to­dzie i do­pie­ro na końcu od­czy­taj wynik. Uwagi wymaga sort bez funk­cji po­rów­nu­ją­cej, bo dla liczb daje po­rzą­dek al­fa­be­tycz­ny, oraz pop i shift, które zwra­ca­ją za­bra­ny ele­ment, a nie skró­co­ną ta­bli­cę.
W za­da­niu prak­tycz­nym ta­bli­ca bywa źró­dłem listy: pętla skleja z jej ele­men­tów napis ze znacz­ni­ka­mi <li>, a gotowy napis trafia do wska­za­ne­go ele­men­tu przez innerHTML. Zapis document.write wy­ko­na­ny po za­ła­do­wa­niu strony kasuje jej do­tych­cza­so­wą treść, więc na praw­dzi­wej stro­nie używa się innerHTML albo metod modelu DOM, opi­sa­nych w osob­nej lekcji. Obok tego arkusz za­ma­wia sumę i śred­nią z ta­bli­cy liczb, wy­lo­so­wa­nie liczby z za­kre­su oraz wy­pi­sa­nie bie­żą­cej daty, zwykle z ręcz­nym do­da­niem je­dyn­ki do numeru mie­sią­ca.

Ściąga

Zapis
Znaczy
const tab = [1, 2, 3];
ta­bli­ca trzech ele­men­tów, in­dek­sy 0, 1 i 2
new Array(1, 2, 3)
ta sama ta­bli­ca za­pi­sa­na kon­struk­to­rem
tab[0]
pierw­szy ele­ment, bo in­dek­sy liczą się od zera
tab.length
liczba ele­men­tów, ostat­ni indeks to length minus 1
tab.push("x")
do­kła­da ele­ment na koniec ta­bli­cy
tab.pop()
za­bie­ra ostat­ni ele­ment i zwraca go
tab.unshift("x")
do­kła­da ele­ment na po­czą­tek ta­bli­cy
tab.shift()
za­bie­ra pierw­szy ele­ment i zwraca go
tab.splice(1, 2)
usuwa dwa ele­men­ty, za­czy­na­jąc od in­dek­su 1
tab.splice(1, 0, "x")
wsta­wia ele­ment na po­zy­cję 1, nic nie usu­wa­jąc
tab.indexOf("x")
indeks pierw­sze­go wy­stą­pie­nia, minus 1 przy braku
tab.join(", ")
skleja ele­men­ty w jeden napis z se­pa­ra­to­rem
tab.sort()
po­rząd­ku­je jak napisy, więc 100 wypada przed 12
tab.sort(function (a, b) { return a - b; })
po­rząd­ku­je liczby ro­sną­co
tab.reverse()
od­wra­ca ko­lej­ność ele­men­tów w ta­bli­cy
tab.forEach(function (el) { })
wy­ko­nu­je funk­cję raz na każdy ele­ment
{ nazwa: "Mysz", cena: 89 }
obiekt, czyli zbiór par klucz i war­tość
obiekt.cena
war­tość klucza, zapis z kropką
obiekt["cena"]
to samo, zapis przyj­mu­ją­cy klucz ze zmien­nej
napis.length
liczba znaków, wła­ści­wość bez na­wia­sów
napis.toUpperCase()
nowy napis za­pi­sa­ny wiel­ki­mi li­te­ra­mi
napis.substring(2, 4)
frag­ment od in­dek­su 2 do 3 włącz­nie
napis.charAt(0)
po­je­dyn­czy znak spod po­da­ne­go in­dek­su
napis.split(";")
dzieli napis na ta­bli­cę po se­pa­ra­to­rze
napis.replace("a", "b")
pod­mie­nia pierw­sze wy­stą­pie­nie frag­men­tu
Math.round(2.5)
3, do naj­bliż­szej liczby cał­ko­wi­tej
Math.floor(2.8)
2, zawsze w dół
Math.ceil(2.1)
3, zawsze w górę
Math.pow(2, 10)
1024, potęga o po­da­nym wy­kład­ni­ku
Math.floor(Math.random() * 6) + 1
losowa liczba cał­ko­wi­ta od 1 do 6
new Date().getMonth()
numer mie­sią­ca, sty­czeń to 0, gru­dzień 11
new Date().getDay()
dzień ty­go­dnia, nie­dzie­la to 0
Pobierz ściągę PDF
ZAWODNIK
egzamin zawodowy INF.02 · INF.03 · INF.04
Serwer Discord
Egzaminy zawodowe IT/Matury/Studia
@yastor
© 2026 Zawodnik · by Yastor
Arkusze i zasady oceniania pochodzą z CKE. Serwis nie jest powiązany z Centralną Komisją Egzaminacyjną.