web-dev-qa-db-fra.com

Comment fonctionne Math.max.apply ()?

Comment fonctionne le 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

Le code ci-dessus trouve le nombre maximum dans la liste. Quelqu'un peut-il me dire comment fonctionne le code ci-dessous? Il semble que ça marche si je passe null or Math. 

console.log(Math.max.apply(Math,list));

Est-ce que tous les user-defined/Native functions ont une méthode d'appel et d'application que nous pouvons utiliser?.

64
Shane

apply accepte un tableau et l'applique en tant que paramètre à la fonction réelle. Alors,

Math.max.apply(Math, list);

peut être compris comme,

Math.max("12", "23", "100", "34", "56", "9", "233");

Ainsi, apply est un moyen pratique de transmettre un tableau de données en tant que paramètres à une fonction. Rappelles toi

console.log(Math.max(list));   # NaN

ne fonctionnera pas, car max n'accepte pas un tableau en entrée.

Utiliser apply présente un autre avantage: vous pouvez choisir votre propre contexte. Le premier paramètre, que vous passez à apply de n'importe quelle fonction, sera le this à l'intérieur de cette fonction. Cependant, max ne dépend pas du contexte actuel. Donc, tout fonctionnerait à la place de 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

Puisque apply EST EN FAIT D&EACUTE;FINI DANS Function.prototype , tout objet de fonction JavaScript valide aura la fonction apply par défaut.

107
thefourtheye

Sur JavaScript ES6, utilisez simplement l'opérateur Spread :

var list = ["12","23","100","34","56","9","233"];
console.log(Math.max(...list));
//                   ^^^ Spread operator 

Quelqu'un peut-il me dire comment fonctionne le code ci-dessous?

Math.max.apply(Math,list)

Invoque une fonction Math.max avec un objet Math à utiliser comme référence this dans la fonction implementation (body) et à list à transmettre en tant qu'arguments.

Donc, cela équivaut finalement à

Math.max("12","23","100","34","56", "9","233")

Il semble que cela fonctionne si je passe null ou Math.

Évidemment, Math.max implémentation n'utilise pas de variable d'instance - il n'y a aucune raison de le faire. L'implémentation naïve itèrerait simplement arguments et trouverait le maximum.

Est-ce que toutes les fonctions natives/définies par l'utilisateur ont une méthode call et apply que nous pouvons utiliser?.

Oui, chaque fonction peut être appelée avec call ou apply

Références:

15
zerkms

Je commencerai par dire que Math.max(...numbers) et Function.prototype.apply() ne devraient être utilisés que pour des tableaux contenant relativement peu d'éléments. (...) et apply échouera ou retournera un résultat incorrect si le tableau est trop grand

Math.max.apply(null | undefined | Math, numbers) est identique à Math.max(...numbers), je recommanderais donc Math.max(...numbers) pour des raisons esthétiques.

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

Si vous devez rechercher le maximum d'éléments dans un tableau numérique très grand: utilisez la méthode Array.reduce().

Array.reduce() peut être utilisé pour trouver le maximum d'éléments dans un tableau numérique, en comparant chaque valeur:

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)

Conclusion:

Tableau numérique relativement petit: utilisez Math.max(...numbers) Tableau numérique très grand: utilisez la méthode Array.reduce()

0
voxun