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?

seseorang235
sumber
16
Ini JavaScript. Ini jauh dari masalah konversi / pemaksaan tipe paling aneh yang akan Anda temukan dalam bahasa ...
Mason Wheeler

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