Warum arbeitet Math.min mit einem Array mit einem Element?

17

Laut MDN akzeptiert Math.min nur Zahlen, und wenn eines der Argumente keine Zahl ist, wird es zurückgegeben NaN. Es ist wahr , dass , wenn wir ein Array mit mehreren Nummern passieren wir bekommen NaN, wie folgt aus : Math.min([1,2]), aber wenn wir ein Array mit nur einer Nummer verwenden, Math.mindie die Nummer in der Reihe, wie in diesem Beispiel zurück: Math.min([5]). Hat jemand eine Idee, warum wir dieses undokumentierte Verhalten sehen?

Jemand235
quelle
16
Es ist JavaScript. Dies ist weit entfernt von den seltsamsten Problemen bei der Typumwandlung / Zwang, die Sie in der Sprache finden ...
Mason Wheeler

Antworten:

47

Laut MDN werden Math.min nur Zahlen akzeptiert, und wenn eines der Argumente keine Zahl ist, wird es zurückgegeben NaN.

Das ist nicht das, was es sagt ( Fettdruck von mir):

Wenn mindestens eines der Argumente nicht in eine Zahl konvertiert werden kann , lautet das Ergebnis NaN.

Typkonvertierung:

  • Math.minverwendet ToNumber, um seine Argumente zu konvertieren.
  • ToNumberverwendet ToPrimitive, um Objects zu konvertieren (und Arrays sind Objects).
  • ToPrimitive Verwendet toString
  • [5].toString()is '5', das zurückgegeben wird ToPrimitive, das es zurückgibt ToNumber, das es analysiert 5und das es zurückgibt Math.min, für das es ein gültiges Argument ist, weil es es nicht ist NaN.
  • [1, 2].toString(), OTOH, ist '1, 2', das zurückgegeben wird ToPrimitive, das es zurückgibt ToNumber, das es analysiert NaN, weil es keine gültige Zahlendarstellung ist. ToNumberÜbergibt dann NaNan Math.min, das dann zurückgibt NaN, weil (wie MDN es angibt) "eines seiner Argumente nicht in eine Zahl konvertiert werden kann" oder (wie die Spezifikation es angibt) "Wenn ein Wert NaN ist, ist das Ergebnis NaN."
Jörg W. Mittag
quelle
25
Die ECMAScript-Spezifikation ist tatsächlich überraschend gut lesbar, wie ich gerade herausgefunden habe.
Jörg W Mittag
3
Ja. Die Number([1,2]);Ergebnisse NaN aber Number([1])Ergebnisse 1.
Bhojendra Rauniyar