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?


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.”.

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.