Wie funktioniert das 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
Der obige Code findet die maximale Anzahl in der Liste. Kann mir jemand sagen, wie der folgende Code funktioniert? Es scheint, dass es funktioniert, wenn ich bestanden habenull or Math.
console.log(Math.max.apply(Math,list));
user-defined/Native functions
Haben alle Call- und Apply-Methoden, die wir verwenden können?
quelle
undefined
oder setzennull
:) Wennmax
versucht wurde, auf etwas im Kontext zuzugreifen oder es zu ändern, wäre es fehlgeschlagen, wenn der Kontext aufundefined
oder gesetzt wärenull
.Math.max
nicht den ersten Parameter, da er keinen Kontext benötigt. Es verarbeitet nur die Daten, die es in den Argumenten empfängt.this
wäre ein guter Ausgangspunkt. Es hat auch einen Abschnittcall
undapply
welche Details dies.Verwenden Sie unter JavaScript ES6 einfach den Spread-Operator :
var list = ["12","23","100","34","56","9","233"]; console.log(Math.max(...list)); // ^^^ Spread operator
quelle
Math.max.apply(Math,list)
Ruft eine
Math.max
Funktion mitMath
Objekt auf, die alsthis
Referenz in der Funktionsimplementierung (body) verwendet undlist
als Argumente übergeben werden soll.Das entspricht also letztendlich
Math.max("12","23","100","34","56", "9","233")
Offensichtlich verwendet die
Math.max
Implementierung keine Instanzvariable - es gibt keinen Grund dafür. Die native Implementierung würde nur durchlaufenarguments
und die maximale finden.Ja, jede einzelne Funktion kann mit
call
oder aufgerufen werdenapply
Verweise:
.apply()
Dokumentation (Credits an @RGraham )quelle
Ich werde zunächst sagen
Math.max(...numbers)
undFunction.prototype.apply()
sollte nur für Arrays mit relativ wenigen Elementen verwendet werden. (...) und apply schlagen entweder fehl oder geben das falsche Ergebnis zurück, wenn das Array zu groß istMath.max.apply(null | undefined | Math, numbers)
ist das gleiche wieMath.max(...numbers)
so würde ichMath.max(...numbers)
aus ästhetischen Gründen empfehlen .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
Wenn Sie das maximale Element in einem sehr großen numerischen Array suchen müssen, verwenden Sie die
Array.reduce()
Methode.Array.reduce()
kann verwendet werden, um das maximale Element in einem numerischen Array zu finden, indem jeder Wert verglichen wird: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)
Fazit:
Numerisches Array, das relativ klein ist: Verwenden Sie
Math.max(...numbers)
Numerisches Array, das sehr groß ist: Verwenden Sie dieArray.reduce()
Methodequelle
Math.max (val1, val2, ...)
Math.max(1, 2, 3); // Math.max([value1[, value2[, ...]]])
value1, value2...
sind Parameter und müssen Numbers MDN Math.max seinSie können nicht
array
alsMath.max
Parameter übergeben. Um ein Array zu übergeben, müssen Sie verwendenapply
.Anwenden
Der erste Parameter von apply ist
this
, der zweite istarray
. Mathematische Methoden entsprechen statischen Methoden in anderen Sprachen. Dies bedeutet, dass keine Objektinstanz erforderlich ist,array.prototype.slice
sodass Siethis
in diesem Fall nicht übergeben müssen .Beispiel
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)
Wenn Sie ein Array als Parameter übergeben möchten, müssen Sie es verwenden
apply
, andernfalls verwenden Siecall
.a pply = a rray
c all = c omma getrennt
Mehr über call & apply
quelle