Как проверить на число псевдомассив arguments?

Прошу помочь разобраться) Как проверить на число псевдомассив arguments?

function avg() {
  let sum = 0;

  for (var i = 0; i < arguments[i]; i++) sum += arguments[i];

  return sum == 0 ? sum : sum / arguments.length;
}

console.log(avg(1, 2, 3, 'f'));


Ответы (2 шт):

Автор решения: vsemozhebuty

Если хотите отсеять даже строки с числами, оставив только аргументы с типом числа, и не учитывать при делении неправильные аргументы, можно попробовать так:

function avg(...args) {
  let sum = 0;
  let validArgumentsCount = 0;

  for (const arg of args) {
    if (typeof arg === 'number') {  // ◄◄◄
      sum += arg;
      validArgumentsCount++;
    }
  }

  return sum === 0 ? sum : sum / validArgumentsCount;
}

console.log(avg(1, 2, 3, 'f'));

Код примера использует копирование содержимого объекта arguments в массив args, используя rest-оператор - этот современный способ считается более эффективным: как минимум в некоторых случаях он улучшает производительность, помогая избегать побочных эффектов реализации JS-движка, а также обладает рядом полезных особенностей (они указаны в статье на MDN).
Синтетический тест быстродействия: https://jsben.ch/JmU9F

→ Ссылка
Автор решения: yar85

Может быть удобно учитывать не только изначально числовые значения, но и значения которые могут быть представлены числом:

function avg() {
  let [count, sum] = [0, 0];
  for (let value of arguments) {
    if (!(isFinite(value = +value))) continue; // пропуск итерации если числовое представление аргумента не является конечным числом (унарный оператор `+` приводит к типу `number`)
    sum += value; 
    ++count; 
  }
  return count && (sum / count);    // в случае нулевого значения `count`, вернется 0 (т.к. логический оператор И возвращает свой левый операнд когда тот является ложным, а `Boolean(0) === false`) 
}

console.log(avg(1, 2, '3', 'f'));   // значение '3' будет обработано как число!

Следует учитывать очевидный нюанс: помимо строкового представления чисел, к number могут успешно приводиться булевые значения, массивы, объекты типа Date, и т.д.. Если такое поведение нежелательно, то к проверке на пропуск значения аргумента (кроме конечности его числового представления) можно добавить доп. условие вида String(converted) !== String(value).trim(), где converted это переменная со значением +value. Это условие пропуска по сути будет означать игнорирование всех значений которые не являются числом или строковым представлением числа.

→ Ссылка