Как проверить на число псевдомассив 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 шт):
Если хотите отсеять даже строки с числами, оставив только аргументы с типом числа, и не учитывать при делении неправильные аргументы, можно попробовать так:
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
Может быть удобно учитывать не только изначально числовые значения, но и значения которые могут быть представлены числом:
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. Это условие пропуска по сути будет означать игнорирование всех значений которые не являются числом или строковым представлением числа.