W tym fragmencie kodu kluczowy problem faktycznie leży w linii 15, gdzie użyto operatora porównania `==` zamiast operatora przypisania `=`. W pętli `for` pierwsza część ma inicjalizować zmienną sterującą, czyli w JavaScripcie poprawny zapis to `for (j = 1; j < 9; j++) { ... }`. Konstrukcja `j == 1` nie ustawia wartości zmiennej, tylko porównuje bieżącą wartość `j` z liczbą 1 i zwraca wynik logiczny `true` lub `false`. W efekcie interpreter próbuje potraktować wynik porównania jako wyrażenie inicjalizujące, co jest po prostu błędem składniowym i skrypt się nie wykona. Z mojego doświadczenia to bardzo częsty błąd: programista myśli o „ustawieniu” wartości i z przyzwyczajenia wpisuje podwójny znak równości. Dlatego w językach takich jak JavaScript, C, Java trzeba mocno pilnować rozróżnienia: `=` oznacza przypisanie, `==` porównanie wartości (a `===` porównanie wartości i typu). Cała reszta algorytmu wyszukiwania maksimum jest w porządku: najpierw przypisujemy do `max` pierwszy element tablicy, potem w pętli przechodzimy kolejne elementy i jeśli aktualny element jest większy lub równy `max`, to aktualizujemy zmienną `max`. Taki schemat jest klasycznym algorytmem liniowego wyszukiwania wartości maksymalnej. W praktyce, gdy piszesz kod produkcyjny, warto dodatkowo zadbać o deklarację zmiennych (`let j = 1;`, `let max = tablica[0];`) oraz używać długości tablicy (`j < tablica.length`) zamiast stałej liczby 9, żeby kod był odporny na zmiany i łatwiejszy w utrzymaniu. W narzędziach typu ESLint często jest też reguła wychwytująca przypadkowe użycie `==` tam, gdzie spodziewane jest `=`, właśnie po to, żeby unikać takich subtelnych, ale groźnych pomyłek.
Kod, który ma znaleźć wartość maksymalną w tablicy, jest w gruncie rzeczy poprawny algorytmicznie, a główny problem leży w składni pętli. Łatwo jednak skupić się na innych fragmentach i szukać błędu tam, gdzie go nie ma. Spójrzmy po kolei na wszystkie podejrzane miejsca. Warunek w instrukcji `if (max <= tablica[j])` może wyglądać podejrzanie, bo często w przykładach używa się operatora `<`. Jednak użycie `<=` nie jest błędem. To znaczy tylko tyle, że jeśli w tablicy występuje kilka identycznych wartości maksymalnych, to `max` przyjmie wartość ostatniego z nich. Algorytm nadal zwróci poprawne maksimum, różnica dotyczy jedynie tego, który indeks „wygra”, jeśli wartości są równe. Z punktu widzenia wyszukiwania największej liczby to zachowanie jest całkowicie akceptowalne. Pojawia się też pokusa, żeby winić linię z `document.write(...)`. Ten zapis jest składniowo poprawny w JavaScripcie: mamy wywołanie metody `write` na obiekcie `document` i konkatenację napisu z wartością zmiennej. Można dyskutować, czy jest to dobra praktyka w nowoczesnych aplikacjach (zwykle lepiej manipulować DOM, np. przez `textContent`), ale nie jest to błąd uniemożliwiający działanie programu. Podobnie przypisanie `max = tablica[0];` jest typowym i poprawnym sposobem inicjalizacji zmiennej maksimum: zakładamy na start, że największym elementem jest pierwszy element tablicy i dopiero później weryfikujemy to w pętli. Tu nie ma żadnej sprzeczności z logiką algorytmu. Prawdziwy problem to użycie operatora porównania `==` w miejscu, gdzie powinniśmy zainicjalizować licznik pętli. Konstrukcja `for (j == 1; j < 9; j++)` nie ustawia wartości `j`, tylko sprawdza, czy aktualne `j` jest równe 1, przez co cała pętla ma niepoprawną składnię. Typowy błąd myślowy polega tutaj na utożsamieniu „ustawienia na 1” z „sprawdzeniem, czy jest równe 1”. W językach imperatywnych to są zupełnie różne operacje. Dobra praktyka to zawsze czytać nagłówek pętli jak zdanie: „ustaw j na 1; dopóki j < 9; po każdej iteracji zwiększ j o 1”. Jeśli to czytanie nie ma sensu, znaczy że coś jest nie tak z operatorem. Warto też pamiętać, że narzędzia linterskie i tryb `use strict` pomagają wychwycić takie pomyłki, zanim trafią one do gotowego kodu.