Por que o Math.min trabalha com uma matriz de um elemento

17

De acordo com o MDN, o Math.min aceita apenas números e, se um dos argumentos não for um número, ele retornará NaN. É verdade que, se passar um array com vários números obtemos NaN, como este: Math.min([1,2]), mas se usar uma matriz com apenas um número, Math.minirá retornar o número na matriz, como neste exemplo: Math.min([5]). Alguém tem uma idéia de por que vemos esse comportamento não documentado?

someone235
fonte

Respostas:

47

De acordo com o MDN, Math.min aceita apenas números e, se um dos argumentos não for um número, ele retornará NaN.

Isso não é o que diz ( negrito grifo meu):

Se pelo menos um dos argumentos não puder ser convertido em um número, o resultado será NaN.

Conversão de tipo:

  • Math.minusa ToNumberpara converter seus argumentos.
  • ToNumberusa ToPrimitivepara converter Objects (e Arrays são Objects).
  • ToPrimitive usa toString
  • [5].toString()é '5', que é retornado ToPrimitive, o que retorna ToNumber, o que analisa 5e retorna Math.min, para o qual é um argumento válido, porque não é NaN.
  • [1, 2].toString(), OTOH, is '1, 2', que é retornado para ToPrimitive, que retorna para ToNumber, que analisa paraNaN , porque não é uma representação numérica válida. ToNumberpassa NaNpara Math.min, que retornará NaN, porque (como a MDN declara) "um de seus argumentos não pode ser convertido em um número" ou (como a especificação especifica) "se algum valor for NaN, o resultado será NaN.".
Jörg W Mittag
fonte
25
A especificação do ECMAScript é realmente surpreendentemente legível, acabei de descobrir.
Jörg W Mittag
3
Sim. Os Number([1,2]);resultados NaN, mas os Number([1])resultados 1.
Bhojendra Rauniyar 6/11/2015