wake-up-neo.net

Wie funktioniert Math.max.apply ()?

Wie funktioniert die 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 Max-Nummer in der Liste. Kann mir jemand sagen, wie der unten stehende Code funktioniert? Es scheint, dass es funktioniert, wenn ich null or Math. übergeben 

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

Haben alle user-defined/Native functions eine Aufruf- und Anwendungsmethode, die wir verwenden können?.

64
Shane

apply akzeptiert ein Array und wendet das Array als Parameter auf die eigentliche Funktion an. So,

Math.max.apply(Math, list);

kann verstanden werden als

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

Daher ist apply eine bequeme Möglichkeit, ein Datenarray als Parameter an eine Funktion zu übergeben. Merken

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

funktioniert nicht, da max kein Array als Eingabe akzeptiert.

Es gibt noch einen weiteren Vorteil, indem Sie apply verwenden. Sie können Ihren eigenen Kontext auswählen. Der erste Parameter, den Sie einer beliebigen Funktion an apply übergeben, ist die this innerhalb dieser Funktion. max hängt jedoch nicht vom aktuellen Kontext ab. Also würde alles anstelle von Math funktionieren.

console.log(Math.max.apply(undefined, list));   # 233
console.log(Math.max.apply(null, list));        # 233
console.log(Math.max.apply(Math, list));        # 233

Da apply TATS&AUML;CHLICH IN Function.prototype definiert ist, hat jedes gültige JavaScript-Funktionsobjekt standardmäßig die Funktion apply.

107
thefourtheye

Verwenden Sie auf JavaScript ES6 einfach den Spread-Operator :

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

Kann mir jemand sagen, wie der unten stehende Code funktioniert?

Math.max.apply(Math,list)

Ruft eine Math.max-Funktion mit Math-Objekt auf, die in der Funktionsimplementierung (body) als this-Referenz verwendet werden soll, und list, die als Argumente übergeben werden.

Das entspricht also letztendlich

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

Es scheint, dass es funktioniert, wenn ich null oder Mathe übergeben.

Offensichtlich verwendet die Math.max-Implementierung keine Instanzvariable - es gibt keinen Grund, dies zu tun. Die naive Implementierung würde einfach arguments durchlaufen und das Maximum finden.

Haben alle benutzerdefinierten/systemeigenen Funktionen eine Aufruf- und Anwendungsmethode, die wir verwenden können?.

Ja, jede einzelne Funktion kann mit call oder apply aufgerufen werden.

Verweise:

15
zerkms

Math.max (val1, val2, ...)

Math.max(1, 2, 3); // Math.max([value1[, value2[, ...]]])
value1, value2... Sind Parameter und müssen Zahlen sein MDN Math.max

Sie können array nicht als Math.max - Parameter übergeben. Um ein Array zu übergeben, müssen Sie apply verwenden.

Anwenden

Der erste Parameter von apply ist this, der zweite ist array. Mathematische Methoden entsprechen statischen Methoden in anderen Sprachen. Dies bedeutet, dass im Gegensatz zu array.prototype.slice Keine Objektinstanz erforderlich ist, sodass Sie in diesem Fall this 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 apply verwenden, andernfalls call.

a pply = a rray
c alle = c omma getrennt
Weitere Informationen zu call & apply

1
rafr3

Ich möchte damit beginnen, dass Math.max(...numbers) und Function.prototype.apply() nur für Arrays mit relativ wenigen Elementen verwendet werden sollten. (...) und apply schlägt fehl oder liefert das falsche Ergebnis, wenn das Array zu groß ist

Math.max.apply(null | undefined | Math, numbers) ist das gleiche wie Math.max(...numbers), daher würde ich Math.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 numerischen Array suchen müssen, das sehr groß ist: Verwenden Sie die Array.reduce()-Methode.

Array.reduce() kann verwendet werden, um das maximale Element in einem numerischen Array zu ermitteln, 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: use Math.max(...numbers) Numerisches Array, das sehr groß ist: Verwenden Sie die Array.reduce()-Methode

0
voxun