chcę aby podana funkcja pobrała tablicę, posortowała, wywaliła wszystko co nie jest liczbą, a liczby wypisała
No i tu masz podstawowy błąd w założeniu - powinieneś dążyć do tego, by funkcje zwracały wartość, nie powinny mieć kilku odpowiedzialności, a już na pewno nie obliczenia i wyświetlanie wyniku jednocześnie. Idealnie byłoby to rozbić na kilka części - a dokładniej trzy bazowe funkcje (1: "posortowała", 2: "wywaliła wszystko co nie jest liczbą", 3: "wypisała"), które można ze sobą łączyć (jedna z nich jest wbudowana - console.log):
// funkcje bazowe:
const sortNumbers = arr => arr.sort((a, b) => a - b)
const filterNumbers = arr => arr
.filter(item => !isNaN(item) && typeof item === 'number')
// funkcje złożone:
const getSortedNumbers = arr => sortNumbers(filterNumbers(arr))
const printNumbers = arr => console.log(getSortedNumbers(arr))
// przykład uzycia:
printNumbers([2, 1, 0, NaN, 'foo', {}, [], /^abc/, true, 7, 3])
Dzięki temu funkcje są maksymalnie reużywalne (komponowalne) i testowalne.
To, że w swoim przykładzie operujesz funkcją nie na argumencie a na zmiennej zewnętrznej sprawia, że funkcja jest "jednorazowa", czyli de facto bezużyteczna - równie dobrze mógłbyś wykonać obliczenia poza nią.
Ewentualnie jak komuś nie zalezy na maksymalnej reużywalności to taka wersja też ujdzie:
const getSortedNumbers = arr => arr
.filter(item => !isNaN(item) && typeof item === 'number')
.sort((a, b) => a - b)
Byle nie mieszać obliczeń i prezentacji wyniku!
PS
arr[i]==NaN
nie działa, bo:
NaN !== NaN
co jest może nieintuicyjne, ale jak najbardziej prawidłowe (to nie wtf JavaScriptu tylko standardowe zachowanie we wszystkich(?) językach programowania). NaN to wartość niezdefiniowana/niereprezentowalna, więc nie da się zrównać dwóch takich wartości, np:
Math.sqrt(-1)
i
Math.sqrt(-2)
nie mają rozwiązań w liczbach rzeczywistych, więc są zamieniane na NaN, ale nie można powiedzieć, że:
Math.sqrt(-1) === Math.sqrt(-2)
bo to matematycznie nie jest prawda (mają dwa rózne rozwiązania na liczbach zespolonych).
Co prawda:
Math.sqrt(-1) === Math.sqrt(-1)
jest prawdą, ale NaN nie przechowuje informacji o tym z jakiego działania powstał, dlatego założono, że NaN !== NaN zawsze.