Metoda indexOf to jeden z tych elementów JavaScriptu, które szybko stają się codziennym narzędziem przy pracy z tablicami i tekstem. Pozwala znaleźć pierwsze wystąpienie wartości albo fragmentu napisu, ale ma też kilka ważnych ograniczeń, które łatwo przeoczyć w kodzie front-endowym. W tym artykule pokazuję, jak korzystać z niej poprawnie, kiedy daje najlepszy efekt i gdzie rozsądniej wybrać inne rozwiązanie.
Najważniejsze fakty o metodzie `indexOf`
- Zwraca pierwszy indeks trafienia albo
-1, gdy nic nie pasuje. - W tablicach porównuje wartości przez ścisłą równość, więc nie znajdzie
NaN. - W napisach szuka pierwszego wystąpienia podciągu i przyjmuje opcjonalną pozycję startową.
- Parametr startowy działa inaczej przy wartościach ujemnych i zbyt dużych.
- Do samej obecności często lepsze jest
includes, a do warunku opartego na funkcji -findIndex.
Jak działa metoda indexOf w tablicach i napisach
Najkrócej ujmując, indexOf odpowiada na pytanie: gdzie znajduje się pierwsze dopasowanie. W tablicy szuka konkretnej wartości, a w napisie - konkretnego ciągu znaków. Wynik jest zawsze oparty o indeksowanie od zera, więc pierwszy element ma pozycję 0, a brak dopasowania oznacza -1.
W praktyce to ważne rozróżnienie, bo zachowanie metody zależy od typu danych. Dla tablic porównanie odbywa się przez ścisłą równość, czyli tak jak przy ===. Dla tekstu metoda działa jak wyszukiwarka fragmentu w łańcuchu znaków, bez analizowania podobieństwa czy odmian słów.
| Wariant | Co przeszukuje | Co zwraca | Najważniejsza cecha |
|---|---|---|---|
| Tablica | Pojedyncze elementy | Indeks lub -1
|
Porównanie przez ścisłą równość |
| Napis | Fragment tekstu | Pozycję pierwszego wystąpienia lub -1
|
Szukanie podciągu znaków |
| Wynik | Nie dotyczy | Indeks od 0 wzwyż albo -1
|
-1 oznacza brak trafienia, nie ostatni element |
Ja traktuję tę metodę jako narzędzie do szybkiego, pierwszego trafienia. Jeśli potrzebuję bardziej złożonego warunku, zwykle od razu myślę o innych rozwiązaniach. To prowadzi naturalnie do pytania: jak używać jej tak, żeby kod był czytelny i bezpieczny.
Jak używać jej poprawnie w kodzie
W codziennej pracy najczęściej spotykam trzy scenariusze: wyszukiwanie w tablicy, wyszukiwanie w napisie i zawężanie zakresu od konkretnej pozycji. Każdy z nich wygląda podobnie, ale różnice są na tyle istotne, że warto je rozdzielić.
W tablicy
const tags = ["seo", "ux", "javascript", "performance"];
const index = tags.indexOf("javascript");
if (index !== -1) {
console.log(`Tag znajduje się pod indeksem ${index}`);
} else {
console.log("Tag nie został znaleziony");
}To najprostszy i najczęstszy przypadek. Wyszukujesz dokładną wartość, a potem sprawdzasz, czy wynik nie jest równy -1. Taki zapis jest ważny, bo indeks 0 jest poprawnym wynikiem, ale jednocześnie jest wartością fałszywą w warunku if.
W napisie
const text = "Garmax pomaga budować strony internetowe, e-commerce i SEO";
const position = text.indexOf("strony");
if (position !== -1) {
console.log(`Fragment zaczyna się od pozycji ${position}`);
}W tekście metoda zwraca pozycję pierwszego wystąpienia szukanego fragmentu. To przydaje się przy podświetlaniu słowa w treści, wycinaniu kawałka stringa albo sprawdzaniu, czy w adresie URL znajduje się określony segment. W praktyce to jedno z najprostszych narzędzi do pracy z krótkimi i średnimi łańcuchami znaków.
Przeczytaj również: Radio buttony w HTML - jak je poprawnie budować i unikać błędów?
Z parametrem startowym
const items = ["home", "about", "blog", "contact", "blog"];
console.log(items.indexOf("blog")); // 2
console.log(items.indexOf("blog", 3)); // 4
console.log(items.indexOf("home", 1)); // -1Drugi argument pozwala zacząć wyszukiwanie od konkretnej pozycji. To przydaje się, gdy chcesz znaleźć kolejne wystąpienie tego samego elementu albo wznowić przeszukiwanie po wcześniejszym trafieniu. W napisach działa to podobnie, ale warto pamiętać, że ujemna pozycja startowa jest interpretowana inaczej niż w tablicach.
Jeżeli opanujesz te trzy warianty, większość typowych zastosowań przestaje być problemem. Dopiero wtedy wychodzą na wierzch pułapki, które najczęściej generują błędy w produkcyjnym kodzie.
Najczęstsze pułapki i ograniczenia
W indexOf najwięcej problemów nie robi sama składnia, tylko założenia, które developer dopisuje sobie w głowie. Właśnie tutaj pojawiają się błędy trudne do wyłapania na szybkim code review.
| Sytuacja | Co się dzieje | Na co uważać |
|---|---|---|
W tablicy szukasz NaN
|
Metoda zwróci -1
|
NaN nie jest równe samo sobie przy porównaniu przez ===
|
| Masz tablicę z pustymi slotami | Puste miejsca są pomijane |
[1, , 3].indexOf(undefined) nie da trafienia |
W napisie podajesz undefined
|
Przeszukiwany jest tekst "undefined"
|
Argument w stringach jest zamieniany na napis |
Wynik to 0
|
To poprawny indeks, ale wartość jest fałszywa | Nie testuj trafienia przez samą prawdę logiczną wyniku |
fromIndex jest większy niż długość tablicy lub napisu |
Wyszukiwanie się nie rozpocznie | Dostaniesz od razu -1
|
Najbardziej zdradliwe są dwa przypadki: NaN oraz indeks 0. Pierwszy wygląda jak normalna wartość liczbowa, ale nie daje się znaleźć przez indexOf. Drugi jest poprawnym trafieniem, lecz łatwo go błędnie odrzucić, jeśli ktoś napisze warunek w stylu if (index).
Gdy te ograniczenia są jasne, łatwiej zdecydować, czy indexOf jest najlepszym wyborem, czy tylko najprostszym z możliwych.

Kiedy wybrać inną metodę zamiast indexOf
W praktyce bardzo często wybieram inną metodę nie dlatego, że indexOf jest zła, tylko dlatego, że inna lepiej pasuje do intencji kodu. To ważna różnica. Dobrze dobrane API zmniejsza liczbę warunków i ułatwia utrzymanie projektu.
| Metoda | Co zwraca | Kiedy ma sens | Ograniczenie |
|---|---|---|---|
indexOf |
Indeks lub -1
|
Gdy szukasz dokładnej wartości albo fragmentu tekstu | Nie opisuje warunku, tylko równość |
includes |
true lub false
|
Gdy interesuje Cię sama obecność elementu | Nie podaje pozycji trafienia |
findIndex |
Indeks lub -1
|
Gdy potrzebujesz warunku typu price > 100 albo sprawdzenia pola obiektu |
Wymaga funkcji zwrotnej i jest czytelny głównie przy złożonych kryteriach |
lastIndexOf |
Ostatni indeks lub -1
|
Gdy chcesz znaleźć ostatnie wystąpienie | Wciąż działa na dokładnym dopasowaniu |
Jeśli potrzebujesz odpowiedzi „tak albo nie”, zwykle lepiej wygląda includes. Jeśli warunek jest logiczny i zależy od zawartości obiektu, wygrywa findIndex. Z kolei indexOf zostaje tam, gdzie wystarcza proste, dokładne wyszukanie - bez dodatkowego kodu i bez sztucznego komplikowania struktury.
Warto też pamiętać o jednym praktycznym szczególe: includes korzysta z porównania SameValueZero, więc potrafi znaleźć NaN, a indexOf nie. To jeden z tych niuansów, które robią realną różnicę w projektach, w których tablice zawierają dane liczbowe lub obliczone wartości.
Gdzie ta metoda naprawdę pomaga w projektach webowych
W projektach webowych indexOf najczęściej nie służy do „naukowego” wyszukiwania danych, tylko do bardzo konkretnej, codziennej roboty. I właśnie dlatego jest tak użyteczna. W e-commerce, CMS-ach i prostych panelach administracyjnych pojawia się częściej, niż wielu osobom się wydaje.
- Sprawdzanie, czy tag, kategoria albo identyfikator produktu już istnieje w tablicy.
- Podświetlanie frazy w treści artykułu, opisu produktu lub komunikatu systemowego.
- Znajdowanie pozycji aktywnej zakładki w menu, filtrze albo breadcrumbs.
- Wyszukiwanie fragmentów w slugach, adresach URL i parametrach nawigacyjnych.
- Usuwanie duplikatów z prostych list, zanim dane trafią do UI.
W takich zastosowaniach ważna jest nie tylko prostota, ale też koszt. indexOf przeszukuje dane liniowo, więc przy małych i średnich kolekcjach to zwykle nie ma znaczenia. Jeżeli jednak w pętli wykonujesz to samo wyszukiwanie wiele razy na dużych zbiorach, lepiej zbudować pomocniczy indeks albo użyć Set. W przeciwnym razie kod zacznie działać poprawnie, ale coraz wolniej.
W praktyce najlepiej sprawdza się podejście: najpierw prosty odczyt przez indexOf, a dopiero potem optymalizacja, jeśli naprawdę widać obciążenie. To rozsądniejsze niż przenoszenie całej logiki na bardziej złożone struktury bez realnej potrzeby.
Jak nie pomylić trafienia z brakiem wyniku
Najczęstszy błąd przy pracy z tą metodą nie polega na złym wywołaniu, tylko na złym odczytaniu wyniku. -1 oznacza brak dopasowania, a 0 jest normalnym wynikiem. Ten detal potrafi zepsuć walidację formularza, logikę menu albo obsługę filtrów.
const selected = ["home", "blog", "kontakt"];
const index = selected.indexOf("home");
if (index !== -1) {
console.log("Element istnieje");
}To podejście jest bezpieczne, czytelne i nie pozostawia miejsca na nieporozumienia. Jeśli chcesz znaleźć wszystkie wystąpienia tego samego elementu, nie kończ pracy na pierwszym trafieniu - tylko iteruj dalej, przesuwając punkt startowy.
const text = "seo seo seo";
const positions = [];
let pos = text.indexOf("seo");
while (pos !== -1) {
positions.push(pos);
pos = text.indexOf("seo", pos + 1);
}
console.log(positions); // [0, 4, 8]Jeżeli zapamiętasz jedną rzecz, niech będzie prosta: indexOf odpowiada na pytanie „gdzie jest pierwsze trafienie?”, a nie „czy coś pasuje do bardziej złożonego warunku”. To właśnie ta różnica decyduje o tym, czy kod będzie krótki i czytelny, czy tylko pozornie prosty.