Wrzucasz do Q wszystkie dzielniki liczby 12.
Ten if z 1||2||3 bardzo razi w oczy, stąd pozwolę sobie wytłumaczyć co tu się dzieje, bo to nie działa tak jak myślisz że działa:
q[i] zawiera jakąś tam liczbę
1||2||3||5||7||11||13 zwraca zawsze true -> proponuję się zapoznać dokładnie z używaniem operatorów, jeżeli chcesz porównywać z osobna q[i] do każdej z tych liczb:
q[i] === 1 || q[i] === 2 || ... itp
Każda z tych liczb do wykonania logicznej operacji OR na nich wpierw zostanie zrzutowana do boola, o ile jest większa o 0 to zwróci true (przynajmniej tak mi się wydaje, niestety nie znam na tyle JS żeby wiedzieć co się na co zrzutuje - jest pełno dziwactw w tym języku)
o ile q[i] > 0 to dana liczba spełnia zatem ww. warunek - tak to jest jak używa się języka słabo typowanego bez porównywania także typów zmiennych.
Jeżeli już chcesz porównywać- używaj === (silnego porównania z typem). W tym wypadku jednak użycie tegoż nie rozwiąże sprawy bo będziesz porównywać liczbę z true co zawsze zwróci false i nic nie doda do listy b.
Na moje zapoznaj się z tym algorytmem, sam oceń po co w ogóle używać takich dziwacznych i nieoptymalnych konstrukcji do tak prostego zagadnienia skoro można to zrobić jedną pętlą bez dodatkowych tablic:
http://www.algorytm....a-czynniki.html