Ваша программа не работает, потому что a
имеет накопленное значение из предыдущего вызова функции. В первый раз будут использоваться первые два значения массива. Таким образом, sum
станет 17
(2 + 15
). Поскольку вы ничего не возвращаете из функции, по умолчанию будет возвращен undefined
, который будет использоваться как значение для a
, в следующем вызове. Таким образом, оценка идет как этот
a: 2, b: 15 => 17
a: undefined, b: 7 => NaN
Итак, sum
будет NaN
, так как undefined + 7
делает это так. Любая цифровая операция на NaN
, всегда будет давать NaN
, поэтому NaN/this.length
, дает вам NaN
. Вы можете исправить свою программу, просто вернув текущее значение sum
всякий раз, когда вызывается функция, так что при следующем вызове функции a
будет иметь надлежащее накопленное значение.
Array.prototype.average = function() {
var sum = 0;
this.reduce(function(a, b) {
sum = a + b;
return sum;
});
return sum/this.length;
};
Но мы не делаем использование силы и гибкости reduce
здесь. Вот два важных момента, которые следует учитывать при использовании reduce
.
reduce
принимает второй параметр, который говорит, что начальное значение будет использоваться. По возможности укажите это.
Первый параметр в функции, переданной в reduce
, накапливает результат и, наконец, будет возвращен, используйте это. Не нужно использовать отдельную переменную, чтобы отслеживать результаты.
Так что ваш код будет выглядеть лучше, как этот
Array.prototype.average = function() {
var sum = this.reduce(function(result, currentValue) {
return result + currentValue
}, 0);
return sum/this.length;
};
console.log([2, 15, 7].average());
# 8
reduce
фактически работает как это. Он выполняет итерацию через массив и передает текущее значение в качестве второго параметра функции и текущий накопленный результат в качестве первого параметра, а значение, возвращаемое функцией, будет храниться в накопленном значении.Таким образом, сумма фактически находится как этот
result: 0 , currentValue: 2 => 2 (Initializer value `0`)
result: 2 , currentValue: 15 => 17
result: 17, currentValue: 7 => 24
Поскольку выбежала из значений из массива, 24
будут возвращены в результате reduce
, который будет храниться в sum
.
Из кода, можно было бы предположить, вы ориентируетесь современный браузер. Я бы предложил использовать 'Object.defineProperty' для расширения' Array.prototype'. (и тестирование того, что метод не существует в первую очередь). Вы даже можете сделать код более общим для работы '(call/apply)' с другими объектами. – Xotic750