¿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?

alguien235
fuente
16
Es JavaScript. Esto está lejos de ser el tipo de conversión / coerción de tipo más extraño que encontrarás en el idioma ...
Mason Wheeler

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".
Jörg W Mittag
fuente
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