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?.
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.
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:
.apply()
documentation (crédits de @RGraham )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()