Jak matematyka.max.apply () praca?
Jak działa Math.max.apply()
?.
<!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 zdam null or Math.
console.log(Math.max.apply(Math,list));
Czy wszystkie user-defined/Native functions
mają metodę call I apply, której możemy użyć?.
4 answers
apply
przyjmuje tablicę i stosuje tablicę jako parametry do rzeczywistej funkcji. Więc
Math.max.apply(Math, list);
Można rozumieć jako,
Math.max("12", "23", "100", "34", "56", "9", "233");
Tak więc, {[4] } jest wygodnym sposobem przekazywania tablicy danych jako parametrów do funkcji. Remember
console.log(Math.max(list)); # NaN
Nie zadziała, ponieważ max
nie akceptuje tablicy jako danych wejściowych.
Jest jeszcze jedna zaleta, używając apply
, Możesz wybrać swój własny kontekst. Pierwszym parametrem przekazanym apply
dowolnej funkcji będzie this
wewnątrz tej funkcji. Ale max
nie zależy od aktualnego kontekstu. Więc wszystko działa na miejscu Math
.
console.log(Math.max.apply(undefined, list)); # 233
console.log(Math.max.apply(null, list)); # 233
console.log(Math.max.apply(Math, list)); # 233
Od apply
jest faktycznie zdefiniowana w Function.prototype
, każdy poprawny obiekt funkcji JavaScript będzie miał domyślnie apply
function.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-07 13:07:24
W JavaScript ES6 wystarczy użyć operatora spreadu:
var list = ["12","23","100","34","56","9","233"];
console.log(Math.max(...list));
// ^^^ Spread operator
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:26
Czy ktoś może mi powiedzieć jak działa poniższy kod?
Math.max.apply(Math,list)
Wywołuje funkcję Math.max
z obiektem Math
, która ma być użyta jako referencja this
w implementacji funkcji (body) i list
przekazywana jako argument.
Więc to ostatecznie równa się
Math.max("12","23","100","34","56", "9","233")
Wydaje się, że działa, jeśli zdam null lub Math.
Oczywiście Math.max
implementacja nie używa zmiennej instancji - nie ma ku temu powodu. Naiwna realizacja po prostu iterować nad arguments
i znaleźć maksimum jeden.
Czy wszystkie funkcje zdefiniowane przez użytkownika/natywne mają metodę call I apply, której możemy użyć?.
Tak, każda pojedyncza funkcja może być wywołana za pomocą call
lub apply
Bibliografia:
-
MDN
.apply()
documentation (credits to @RGraham )
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:30
Matematyka.max (val1, val2,...)
Math.max(1, 2, 3); // Math.max([value1[, value2[, ...]]])
value1, value2...
są parametrami i muszą być liczbami MDN Math.max
Nie możesz przekazać array
jako Math.max
parametrów. Aby przekazać tablicę musisz użyć apply
.
Zastosuj
Pierwszy parametr apply to this
, drugi to array
.
Metody matematyczne są odpowiednikiem statycznych w innych językach, co oznacza, że nie potrzebuje instancji obiektu w przeciwieństwie do array.prototype.slice
, więc nie musisz przekazywać this
w tym case.
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, musisz użyć apply
, w przeciwnym razie użyj call
.
Apply = a rray
Call = C OMMA
więcej o call & apply
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-12 15:40:49