Baiklah, jadi saya bermain-main dengan parseInt untuk melihat bagaimana ia menangani nilai-nilai yang belum diinisialisasi dan saya menemukan permata ini. Di bawah ini terjadi untuk setiap radix 24 atau lebih tinggi.
parseInt(null, 24) === 23 // evaluates to true
Saya mengujinya di IE, Chrome dan Firefox dan mereka semua memberi peringatan benar, jadi saya pikir pasti ada dalam spesifikasi di suatu tempat. Pencarian Google cepat tidak memberi saya hasil apa pun jadi saya di sini, berharap seseorang dapat menjelaskan.
Saya ingat mendengarkan pidato Crockford di mana ia berkata typeof null === "object"
karena kekhilafan yang menyebabkan Object dan Null memiliki pengenal tipe yang hampir sama dalam ingatan atau sesuatu di sepanjang garis itu, tetapi saya tidak dapat menemukan video itu sekarang.
Cobalah: http://jsfiddle.net/robert/txjwP/
Edit Koreksi: radix yang lebih tinggi menghasilkan hasil yang berbeda, 32 mengembalikan 785077
Edit 2 Dari zzzzBov:[24...30]:23, 31:714695, 32:785077, 33:859935, 34:939407, 35:1023631, 36:1112745
tl; dr
Jelaskan mengapa parseInt(null, 24) === 23
pernyataan itu benar.
sumber
alert(parseInt(null, 34) === 23)
diproduksifalse
alert(parseInt(null,26)===23);
juga menghasilkan benar?!?![24...30]:23
,31:714695
,32:785077
,33:859935
,34:939407
,35:1023631
,36:1112745
,[37...]:NaN
undefined
ketika parameter pertama mengembalikan hasil yang aneh untuk 30-anJawaban:
Konversi
null
ke string"null"
dan mencoba mengubahnya. Untuk radix 0 hingga 23, tidak ada angka yang dapat dikonversi, sehingga kembaliNaN
. Pada 24,,"n"
surat ke-14, ditambahkan ke sistem angka. Pada 31,,"u"
huruf ke-21, ditambahkan dan seluruh string dapat diterjemahkan. Pada 37 pada tidak ada lagi set angka yang valid yang dapat dihasilkan dan NaN dikembalikan.sumber
toString()
?Mozilla memberi tahu kami :
Dalam spec , 15.1.2.2/1 memberi tahu kita bahwa konversi ke string dilakukan menggunakan built-in
ToString
, yang (sesuai 9,8) menghasilkan"null"
(tidak harus bingung dengantoString
, yang akan menghasilkan"[object Window]"
!).Jadi, mari kita pertimbangkan
parseInt("null", 24)
.Tentu saja, ini bukan string numerik basis-24 secara keseluruhan, tetapi "n" adalah: ini desimal 23 .
Sekarang, parsing berhenti setelah desimal 23 ditarik keluar, karena
"u"
tidak ditemukan dalam sistem basis-24:(Dan inilah sebabnya
parseInt(null, 23)
(dan radex yang lebih rendah) memberi AndaNaN
lebih dari 23:"n"
tidak ada di sistem base-23.)sumber
Ignacio Vazquez-Abrams benar, tetapi mari kita lihat bagaimana cara kerjanya ...
Dari
15.1.2.2 parseInt (string , radix)
:Ada dua bagian penting di sini. Saya berani keduanya. Jadi pertama-tama, kita harus mencari tahu apa
toString
representasinull
itu. Kita perlu melihatTable 13 — ToString Conversions
di bagian 9.8.0 untuk informasi itu:Hebat, jadi sekarang kita tahu bahwa melakukan secara
toString(null)
internal menghasilkan'null'
string. Hebat, tapi bagaimana tepatnya menangani digit (karakter) yang tidak valid dalam radix yang disediakan?Kami melihat ke atas
15.1.2.2
dan kami melihat komentar berikut:Itu berarti bahwa kami menangani semua digit SEBELUM dengan radix yang ditentukan dan mengabaikan yang lainnya.
Pada dasarnya, melakukan
parseInt(null, 23)
adalah hal yang sama denganparseInt('null', 23)
. Theu
menyebabkan dual
's untuk diabaikan (meskipun mereka ADALAH bagian dari radix 23). Karena itu, kami hanya dapat menguraikann
, menjadikan seluruh pernyataan sama denganparseInt('n', 23)
. :)Either way, pertanyaan bagus!
sumber
Setara dengan
yang setara dengan
Digit untuk basis 24 adalah 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, ..., n.
Spesifikasi bahasa mengatakan
yang merupakan bagian yang memastikan bahwa literer integer C-style seperti
15L
parse dengan benar, sehingga di atas setara dengan"n"
adalah huruf ke 23 dari daftar digit di atas.QED
sumber
Saya kira
null
akan dikonversi ke string"null"
. Jadin
sebenarnya23
dalam 'base24' (sama dalam 'base25' +),u
tidak valid di 'base24' sehingga sisa stringnull
akan diabaikan. Karena itulah ia mengeluarkan23
hinggau
menjadi valid di 'base31'.sumber
parseInt menggunakan representasi alfanumerik, maka pada basis-24 "n" valid, tetapi "u" adalah karakter yang tidak valid, maka parseInt hanya mem-parsing nilai "n" ....
sebagai contoh, coba dengan ini:
Hasilnya akan menjadi "3".
sumber