Mengapa Math.min bekerja dengan array satu elemen


17

Menurut MDN Math.min hanya menerima angka, dan jika salah satu argumen bukan angka, itu akan kembali NaN. Memang benar bahwa jika kita melewatkan sebuah array dengan beberapa nomor yang kita dapatkan NaN, seperti ini: Math.min([1,2]), tetapi jika kita menggunakan array dengan hanya satu nomor, Math.minakan mengembalikan nomor dalam array, seperti dalam contoh ini: Math.min([5]). Adakah yang tahu mengapa kita melihat perilaku tidak berdokumen ini?


Jawaban:


47

Menurut MDN Math.min hanya menerima angka, dan jika salah satu argumen bukan angka, itu akan kembali NaN.

Bukan itu yang dikatakannya ( penekanan berani saya):

Jika setidaknya salah satu argumen tidak dapat dikonversi ke angka, hasilnya adalah NaN.

Jenis Konversi:

  • Math.mingunakan ToNumberuntuk mengkonversi argumennya.
  • ToNumbergunakan ToPrimitiveuntuk mengonversi Objects (dan Arrays adalah Objects).
  • ToPrimitive menggunakan toString
  • [5].toString()adalah '5', yang dikembalikan ke ToPrimitive, yang mengembalikannya ToNumber, yang mem-parsing ke 5dan mengembalikannya ke Math.min, yang merupakan argumen yang valid, karena tidak NaN.
  • [1, 2].toString(), OTOH, adalah '1, 2', yang dikembalikan ke ToPrimitive, yang mengembalikannya ToNumber, yang menguraikannya NaN, karena itu bukan representasi angka yang valid. ToNumberlalu beralih NaNke Math.min, yang kemudian akan kembali NaN, karena (seperti yang dinyatakan MDN) "salah satu argumennya tidak dapat dikonversi ke angka" atau (seperti yang dinyatakan oleh spec) "Jika ada nilai NaN, hasilnya adalah NaN.".

25
Spesifikasi ECMAScript ternyata bisa dibaca, saya baru tahu.
Jörg W Mittag

3
Iya. The Number([1,2]);hasil NaN tapi Number([1])hasil 1.
Bhojendra Rauniyar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.