2011-07-25 10 views
11

Powiel możliwe:
How to use Math.max, etc. as higher-order functionsDlaczego nie mogę napisać [1,2,3] .reduce (Math.max) w JavaScript?

Korzystanie Mozilla JavaScript 1.6 wachlarz funkcji 'rozszerzenie' (mapa, zmniejszyć, filtr itd.), To dlaczego jest tak, że następujących robót zgodnie z oczekiwaniami:

var max = [1,2,3].reduce(function(a,b) { return Math.max(a,b); }); 

Ale dodaje nie działa (NaN):

var max2 = [1,2,3].reduce(Math.max); 

Czy to dlatego, że Math.max jest funkcją variadic?

+3

Nie do końca na temat, ale jeśli chcesz łatwo zredukować tablicy do jej maksymalnej wartości, można użyć '.apply()' 'na Math.max'. 'var max = Math.max.apply (null, [1,2,3,4]);' – user113716

Odpowiedz

12

Math.max nie wie, co zrobić ze wszystkimi dodatkowymi zmiennymi function(previousValue, currentValue, index, array) głównie tą tablicę na końcu.

[].reduce.call([1,2,3,6],function(a,b) { return Math.max(a,b); }); 

To działa i wykorzystuje .call

+1

Czekaj, widzę ... Zapomniałem, że są "dodatkowe" parametry przekazane do funkcji przekazanej do zredukowania. Więc max próbuje również znaleźć maksimum na tych dodatkowych parametrach. – sacheie

+0

prawe i 'Math.max (1, [1,2,3])' to 'NaN' – Joe

+4

Dlaczego używałbyś .call(), jeśli zamierzasz przekazać tablicę jako wartość' this'? To po prostu zbyt skomplikowany sposób robienia tego, co OP już pokazał w pytaniu. – nnnnnn

Powiązane problemy