Dobre pytanie. Jak zwykle - problemy ze słabym typowaniem
Podstawowa sprawa - funkcji isNaN używa się tylko na sparsowanych zmiennych, ponieważ, jak się okazuje, bez problemu przepuszcza stringa np "-4". -> wewnątrz funkcji odbywa się niejawna konwersja typu na int, a program ochoczo rusza dalej, niosąc ze sobą pierwszy "błąd".
Dla ułatwienia, oznaczmy sobie zmienne a = "-4", b = "-1".
Zaczynamy od if ( b> a )
I w tym momencie robi się ciekawie. Stwierdzimy oczywiście, że b jest większe od a.. STOP!
W rzeczywistości nasz warunek nie wygląda tak: (-1>-4) tylko tak: ("-1">"-4") Co to oznacza? - Porównywane są stringi, JS sprawdzi czy "-1" jest dalej w kolejności alfabetycznej niż "-4".
Znak "-" występuje w obu stringach na pierwszym miejscu, toteż sprawdzane będą kolejne znaki - dalej nastąpi porównanie 1 oraz 4. W tym momencie szybko okazuje się, że "-1" jest mniejsze, a nasz warunek ( b > a ) zwraca FAŁSZ (pisząc ten kod, z pewnością nie takiego zachowania się spodziewaliśmy)
Program wykonuje się dalej - ciągnąc ze sobą już dwa "błędy"
Drugi if ( b< a ) zwróci zatem TRUE, i zacznie się wykonywać taka oto pętla:
for(i = b; i <= a; i++) napisz = napis + i + ' ';
Podłóżmy wartości "liczbowe":
for(i = "-1"; i <= "-4"; i++) napisz = napis + i + ' ';
i poiterujmy:
Iteracja pierwsza:
i = "-1";
sprwadzenie warunku ( "-1"<= "-4" ) TRUE - pętla wykonywana jest dalej;
napis = "" + "-1" + ' ';
i++ ( Zgadnijcie co zwraca "-1"++ ? -0 (słownie ZERO) - najzwyklejsze zero, które jest LICZBĄ;
Iteracja druga:
i = 0;
sprawdzanie warunku ( 0<= "-4" ) FALSE (w tym przypadku następuje niejawna konwersja z "-4" na -4, i bez niespodzianek, -4 nie jest większe lub równe 0) - pętla kończy działanie;
Zostaje już tylko wyświetlenie zmiennej napis, w której siedzi ""+"-1"+' ' - czyli zwyczajny string "-1".
Stąd ten dziwny wynik : )
Morał: Zawsze parsujcie zmienne z inputów!