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ć?.

Author: thefourtheye, 2014-01-21

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.

 101
Author: thefourtheye,
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 
 18
Author: Walter Chapilliquen - wZVanG,
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:

 15
Author: zerkms,
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

 0
Author: rafr3,
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