Jak to Math.max.apply()
działa?
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>JS Bin</title>
</head>
<body>
<script>
var list = ["12","23","100","34","56",
"9","233"];
console.log(Math.max.apply(Math,list));
</script>
</body>
</html>
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
Powyższy kod znajduje maksymalną liczbę na liście. Czy ktoś może mi powiedzieć, jak działa poniższy kod? Wygląda na to, że działa, jeśli zdamnull or Math.
console.log(Math.max.apply(Math,list));
Czy wszystkie user-defined/Native functions
mają metodę call and apply, której możemy użyć?
źródło
undefined
lubnull
:) Gdybymax
próbować uzyskać dostęp / zmienić cokolwiek w kontekście, nie powiodło się, gdy kontekst jest ustawiony naundefined
lubnull
.Math.max
nie użyje pierwszego parametru, ponieważ nie potrzebuje on żadnego kontekstu. Działa tylko na danych, które otrzymuje w argumentach.this
byłby dobrym punktem wyjścia. Ma również sekcjęcall
iapply
która to szczegółowo opisuje.W JavaScript ES6 po prostu użyj operatora Spread :
var list = ["12","23","100","34","56","9","233"]; console.log(Math.max(...list)); // ^^^ Spread operator
źródło
Math.max.apply(Math,list)
Wywołuje
Math.max
funkcję zMath
obiektem, który ma być używany jakothis
odniesienie w implementacji funkcji (treść) ilist
przekazywany jako argumenty.Więc to ostatecznie równa się
Math.max("12","23","100","34","56", "9","233")
Oczywiście
Math.max
implementacja nie wykorzystuje zmiennej instancji - nie ma powodu, aby to robić. Natywna implementacja po prostu dokona iteracjiarguments
i znajdzie maksymalną.Tak, każdą funkcję można wywołać za pomocą
call
lubapply
Bibliografia:
.apply()
Dokumentacja MDN (kredyty dla @RGraham )źródło
Zacznę od stwierdzenia
Math.max(...numbers)
iFunction.prototype.apply()
powinienem być używany tylko dla tablic ze stosunkowo niewielką liczbą elementów. (...) i Apply zakończy się niepowodzeniem lub zwróci nieprawidłowy wynik, jeśli tablica jest zbyt dużaMath.max.apply(null | undefined | Math, numbers)
jest taki sam jakMath.max(...numbers)
ten, który polecamMath.max(...numbers)
ze względów estetycznych.const numbers = [5, 6, 2, 3, 7]; const max = Math.max(...numbers); console.log('max:', max); // expected output: 7 const min = Math.min(...numbers); console.log('min:', min); // expected output: 2
Jeśli potrzebujesz znaleźć maksymalny element w tablicy numerycznej, który jest bardzo duży: użyj
Array.reduce()
metody.Array.reduce()
można użyć do znalezienia maksymalnego elementu w tablicy liczbowej, porównując każdą wartość:const numbers = [5, 6, 2, 3, 7]; const getMax = (numbers) => numbers.reduce((a, b) => Math.max(a, b)); const getMin = (numbers) => numbers.reduce((a, b) => Math.min(a, b)); const max = getMax(numbers) const min = getMin(numbers) console.log('max:', max) console.log('min:', min)
Wniosek:
Tablica numeryczna, która jest stosunkowo mała: użyj
Math.max(...numbers)
tablicy liczbowej, która jest bardzo duża: użyjArray.reduce()
metodyźródło
Math.max (wart1, wart2, ...)
Math.max(1, 2, 3); // Math.max([value1[, value2[, ...]]])
value1, value2...
są parametrami i muszą być liczbami MDN Math.maxNie możesz podać
array
jakoMath.max
parametrów. Aby przekazać tablicę, musisz użyćapply
.Zastosować
Pierwszy parametr zastosuj to
this
, a drugi toarray
. Metody matematyczne są równoważne statycznym w innych językach, co oznacza, że nie wymaga instancji obiektu w przeciwieństwie doarray.prototype.slice
tego, więcthis
w tym przypadku nie trzeba ich przekazywać .Przykład
var arr = [1, 2, 3]; Math.max(1, 2, 3); // -> 3 Math.max(arr); // -> NaN (Not a Number) Math.max.apply(null, arr); // Math.max.apply(null, [1, 2, 3]) -> Math.max(1, 2, 3) -> 3 arr.slice(1); // -> returns Array [2, 3] Array.prototype.slice.call(arr, 1); // Array.prototype.slice.call([1, 2, 3], 1) == [1, 2, 3].slice(1)
Jeśli chcesz przekazać tablicę jako parametr, którego musisz użyć
apply
, w przeciwnym razie użyjcall
.a pply = a rray
c all = c omma Separated Więcej o dzwoń i aplikuj
źródło