Twój program nie działa, ponieważ a
ma skumulowaną wartość z poprzedniego wywołania funkcji. Za pierwszym razem zostaną użyte pierwsze dwie wartości tablicy. Tak więc sum
stanie się 17
(2 + 15
). Ponieważ nie zwracasz niczego z funkcji, domyślnie zostanie zwrócony kod undefined
, który zostanie użyty jako wartość dla a
w następnym wywołaniu. Tak więc ocena idzie tak
a: 2, b: 15 => 17
a: undefined, b: 7 => NaN
So, sum
będzie miał NaN
, ponieważ undefined + 7
sprawia, że tak. Każda operacja numeryczna na NaN
, zawsze da NaN
, dlatego NaN/this.length
, daje NaN
. Możesz naprawić swój program, zwracając bieżącą wartość sum
za każdym razem, gdy wywoływana jest funkcja, dzięki czemu przy następnym wywołaniu funkcji, a
będzie miała odpowiednią skumulowaną wartość.
Array.prototype.average = function() {
var sum = 0;
this.reduce(function(a, b) {
sum = a + b;
return sum;
});
return sum/this.length;
};
Ale nie wykorzystujemy tutaj mocy i elastyczności reduce
. Oto dwa ważne punkty, które należy rozważyć podczas korzystania z reduce
.
akceptuje drugi parametr, który zawiera wartość początkową, która ma być użyta. O ile to możliwe, określ to.
Pierwszy parametr w funkcji przekazanej do reduce
kumuluje wynik, który zostanie ostatecznie zwrócony, skorzystaj z tego. Nie musisz używać oddzielnej zmiennej, aby śledzić wyniki.
Tak Twój kod będzie wyglądać lepiej jak ten
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
faktycznie działa w ten sposób. Wykonuje iterację w tablicy i przekazuje bieżącą wartość jako drugi parametr funkcji, a bieżący zakumulowany wynik jako pierwszy parametr, a wartość zwrócona z funkcji zostanie zapisana w skumulowanej wartości.Więc, suma jest rzeczywiście znalazł się ten
result: 0 , currentValue: 2 => 2 (Initializer value `0`)
result: 2 , currentValue: 15 => 17
result: 17, currentValue: 7 => 24
Ponieważ zabrakło wartości z tablicy, 24
zostanie zwrócona jako wynik reduce
, które będą przechowywane w sum
.
z kodu, można by zakładać, są kierowane nowoczesną przeglądarkę. Sugerowałbym użycie 'Object.defineProperty' do rozszerzenia' Array.prototype'. (i testowanie, że metoda nie istnieje w pierwszej kolejności). Można nawet uczynić kod bardziej ogólnym, aby działał '' (wywoływać/aplikuj) 'z innymi obiektami. – Xotic750