Perché Math.min funziona con un array a un elemento


17

Secondo MDN Math.min accetta solo numeri e se uno degli argomenti non è un numero, verrà restituito NaN. E 'vero che se si passa un array con più numeri otteniamo NaN, come questo: Math.min([1,2])ma, se si usa un array con un solo numero, Math.minrestituirà il numero nella matrice, come in questo esempio: Math.min([5]). Qualcuno ha un'idea del perché vediamo questo comportamento senza documenti?


Risposte:


47

Secondo MDN Math.min accetta solo numeri e se uno degli argomenti non è un numero, verrà restituito NaN.

Non è quello che dice ( grassetto enfasi mio):

Se almeno uno degli argomenti non può essere convertito in un numero, il risultato è NaN.

Tipo di conversione:

  • Math.minusa ToNumberper convertire i suoi argomenti.
  • ToNumberusa ToPrimitiveper convertire Objects (e Arrays sono Objects).
  • ToPrimitive usi toString
  • [5].toString()è '5', che viene restituito a ToPrimitive, che lo restituisce a ToNumber, che lo analizza 5e lo restituisce Math.min, per il quale è un argomento valido, perché non lo è NaN.
  • [1, 2].toString(), OTOH, is '1, 2', a cui viene restituito ToPrimitive, a cui lo restituisce, a ToNumbercui viene analizzato NaN, poiché non è una rappresentazione numerica valida. ToNumberquindi passa NaNa Math.min, che quindi restituirà NaN, perché (come indicato da MDN) "uno dei suoi argomenti non può essere convertito in un numero" o (come indicato dalla specifica) "Se un valore è NaN, il risultato è NaN.".

25
Le specifiche ECMAScript sono in realtà sorprendentemente leggibili, l'ho appena scoperto.
Jörg W Mittag,

3
Sì. I Number([1,2]);risultati NaN ma i Number([1])risultati 1.
Bhojendra Rauniyar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.