function isNumeric(value) { // ф-ия возвращает true или false, в зависимости от входящего значения, если аргумент приводится к числу, то true, иначе false
var num = Number(value); // приводим к числу, Number('5') === 5
return !Number.isNaN(num) && // Number('abs') is NaN
Number.isFinite(num) && // num !== Infinity && num !== -Infinity
value.constructor !== Array; // если входящий параметр массив [5], то, из-за правил приведения типов в js Number([5]) === 5, т.к. [5].toString() === '5', Number('5') === 5
}
arr
.filter(value => isNumeric(value)) // получаем массив, где предикат isNumeric вернул true
.reduce((agg, value) => agg + Number(value), 0); // складываем все значения отфильтрованного массива
// то же, что и выше только в "классическом" виде, отработает быстрее, т.к. мы один раз пройдемся по массиву, вместо двух
// код выше можно переписать, убрав filter и добавив проверку в callback функцию reduce для скорости
var agg = 0;
for(const value of arr) {
if(isNumeric(value)) agg += Number(value);
}