Dlaczego Math.min działa z tablicą z jednym elementem

17

Według MDN Math.min akceptuje tylko liczby, a jeśli jeden z argumentów nie jest liczbą, zostanie zwrócony NaN. To prawda, że jeśli mijamy tablicę z wielu numerów otrzymujemy NaNcoś takiego: Math.min([1,2]), ale jeśli używamy tablicę z jednym numerem, Math.minzwróci liczbę w tablicy, jak w poniższym przykładzie: Math.min([5]). Czy ktoś ma pojęcie, dlaczego widzimy to nieudokumentowane zachowanie?

someone235
źródło
16
To jest JavaScript. Jest to dalekie od najdziwniejszych problemów konwersji / przymusu, jakie można znaleźć w języku ...
Mason Wheeler,

Odpowiedzi:

47

Według MDN Math.min akceptuje tylko liczby, a jeśli jeden z argumentów nie jest liczbą, zostanie zwrócony NaN.

To nie tak mówi ( moje śmiałe podkreślenie):

Jeśli co najmniej jednego z argumentów nie można przekonwertować na liczbę, wynikiem jest NaN.

Konwersja typu:

  • Math.minsłuży ToNumberdo konwersji jego argumentów.
  • ToNumberużywa ToPrimitivedo konwersji Objects (i Arrays są Objects).
  • ToPrimitive wykorzystuje toString
  • [5].toString()jest '5', do którego zwracany jest ToPrimitive, który zwraca go, do ToNumberktórego analizuje 5i zwraca go Math.min, dla którego jest poprawnym argumentem, ponieważ tak nie jest NaN.
  • [1, 2].toString(), OTOH, to '1, 2', do którego zwracany jest ToPrimitive, który zwraca go, do ToNumberktórego analizuje NaN, ponieważ nie jest to poprawna reprezentacja liczb. ToNumbernastępnie przechodzi NaNdo Math.min, który następnie zwróci NaN, ponieważ (jak stwierdza MDN) „jeden z argumentów nie może zostać przekonwertowany na liczbę” lub (jak podaje specyfikacja) „Jeśli jakakolwiek wartość to NaN, wynikiem jest NaN.”.
Jörg W Mittag
źródło
25
Właśnie się dowiedziałem, że specyfikacja ECMAScript jest zaskakująco czytelna.
Jörg W Mittag,
3
Tak. Number([1,2]);Wyniki NaN ale Number([1])wyniki 1.
Bhojendra Rauniyar