¿Por qué Math.min funciona con una matriz de un elemento?


17

De acuerdo con MDN Math.min solo acepta números, y si uno de los argumentos no es un número, regresará NaN. Es cierto que si se pasa un array con varios números obtenemos NaN, así: Math.min([1,2])pero si utilizamos una matriz con un solo número, Math.mindevolverá el número de la matriz, como en este ejemplo: Math.min([5]). ¿Alguien tiene una idea de por qué vemos este comportamiento indocumentado?


Respuestas:


47

Según MDN Math.min solo acepta números, y si uno de los argumentos no es un número, regresará NaN.

Eso no es lo que dice ( énfasis en negrita mío):

Si al menos uno de los argumentos no se puede convertir a un número, el resultado es NaN.

Conversión de tipo:

  • Math.minutiliza ToNumberpara convertir sus argumentos.
  • ToNumberutiliza ToPrimitivepara convertir Objects (y Arrays son Objects).
  • ToPrimitive usos toString
  • [5].toString()es decir '5', lo que se devuelve ToPrimitive, lo que lo devuelve ToNumber, lo que lo analiza 5y lo devuelve Math.min, para lo cual es un argumento válido, porque no lo es NaN.
  • [1, 2].toString(), OTOH, es '1, 2', que se devuelve a ToPrimitive, que se devuelve a ToNumber, que se analiza NaN, porque no es una representación de número válida. ToNumberluego pasa NaNa Math.min, que luego regresará NaN, porque (como MDN lo dice) "uno de sus argumentos no se puede convertir en un número" o (como lo especifica la especificación) "Si algún valor es NaN, el resultado es NaN".

25
La especificación ECMAScript es sorprendentemente legible, me acabo de enterar.
Jörg W Mittag

3
Si. Los Number([1,2]);resultados NaN pero Number([1])resultados 1.
Bhojendra Rauniyar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.