перебирать по одному - долго. Можно находить простые делители, выяснять их максимальную степень в составе числа, и делить число на найденное простое в этой степени. Делители числа могут состоять только из тех же простых, но в степенях не более, чем эти простые в составе числа.
например, число 60 = 2^2 * 3 * 5.
Здесь в составе числа есть простые числа 2, 3 и 5. В делителях числа 60 двойка может быть в степенях 0,1,2, то есть всего 3 варианта. Тройка и пятерка - только в степенях 0 и 1, то есть по 2 варианта. И мы просто перемножаем количества вариантов. 3 * 2 * 2 = 12, то есть всего 12 различных делителей у числа 60
const dividerCounter = (n) => {
let num = n;
let count = 1;
for (let i = 2; i <= num; i++) {
if (num % i === 0) {
// num делится на i. Значит, i - простое.
// Если бы оно не было простым, то состояло бы из других простых,
// более мелких. Но ведь их выкинули из num на предыдущих итерациях.
let pow = 1;
let ipow = i;
// определяем степень для простого числа i
for (let ipowNext = i * i; num % ipowNext === 0; ipowNext = ipowNext * i) {
pow++;
ipow = ipowNext;
}
count = count * (pow + 1);
num = num / ipow; // теперь в составе num нет простого числа i
}
}
return count;
}
эта оптимизация, конечно, не будет работать, если в dividerCounter передать простое число - там придется честно по одному дойти до этого числа. Но таких чисел относительно мало.