Saya membaca ini tetapi saya bingung dengan apa yang ditulis di parseInt dengan bab argumen radix
Mengapa begitu parseInt(8, 3)
→ NaN
dan parseInt(16, 3)
→ 1
?
AFAIK 8 dan 16 bukan angka dasar-3, jadi parseInt(16, 3)
harus kembali NaN
juga
javascript
numbers
parseint
radix
Devid Farinelli
sumber
sumber
Jawaban:
Ini adalah sesuatu yang sering dilalui orang, bahkan ketika mereka mengetahuinya. :-) Anda melihat ini karena alasan yang sama
parseInt("1abc")
mengembalikan 1:parseInt
berhenti pada karakter pertama yang tidak valid dan mengembalikan apa pun yang dimilikinya pada saat itu. Jika tidak ada karakter yang valid untuk diurai, ia kembaliNaN
.parseInt(8, 3)
berarti "parse"8"
in base 3" (perhatikan bahwa ia mengonversi angka8
menjadi string; perincian dalam spesifikasi ). Tapi dalam basis 3, nomor satu digit hanya0
,1
, dan2
. Ini seperti memintanya untuk menguraikan"9"
dalam oktal. Karena tidak ada karakter yang valid, Anda dapatNaN
.parseInt(16, 3)
memintanya untuk menguraikan"16"
dalam basis 3. Karena ia dapat menguraikan1
, itu, dan kemudian berhenti pada6
karena tidak dapat menguraikannya. Jadi ia kembali1
.Karena pertanyaan ini mendapatkan banyak perhatian dan mungkin mendapat peringkat tinggi dalam hasil pencarian, inilah daftar opsi untuk mengubah string menjadi angka dalam JavaScript, dengan berbagai keanehan dan aplikasi mereka (diangkat dari jawaban saya yang lain di sini di SO):
parseInt(str[, radix])
- Mengubah sebanyak mungkin bagian awal string menjadi angka (bilangan bulat) keseluruhan, mengabaikan karakter tambahan di bagian akhir. BegituparseInt("10x")
juga10
; yangx
diabaikan. Mendukung argumen radix (angka dasar) opsional, demikianparseInt("15", 16)
juga21
(15
dalam hex). Jika tidak ada radix, asumsikan desimal kecuali string dimulai dengan0x
(atau0X
), dalam hal ini dilewati dan diasumsikan hex. (Beberapa browser digunakan untuk memperlakukan string yang dimulai dengan0
oktal; perilaku itu tidak pernah ditentukan, dan secara khusus tidak diizinkan dalam spesifikasi ES5.) KembaliNaN
jika tidak ditemukan angka yang dapat diuraikan .parseFloat(str)
- SukaparseInt
, tetapi apakah angka floating-point dan hanya mendukung desimal. Lagi karakter tambahan pada string diabaikan, begituparseFloat("10.5x")
juga10.5
(x
diabaikan). Karena hanya desimal yang didukung,parseFloat("0x15")
adalah0
(karena parsing berakhir padax
). KembaliNaN
jika tidak ditemukan angka yang dapat diuraikan.Unary
+
, eg+str
- (Misalnya, konversi implisit) Mengubah seluruh string menjadi angka menggunakan floating point dan notasi angka standar JavaScript (hanya digit dan titik desimal = desimal;0x
awalan = hex;0o
awalan = oktal [ES2015 +]; beberapa implementasi memperpanjangnya untuk memperlakukan pemimpin0
sebagai oktal, tetapi tidak dalam mode ketat).+"10x"
adalahNaN
karenax
ini tidak diabaikan.+"10"
is10
,+"10.5"
is10.5
,+"0x15"
is21
,+"0o10"
is8
[ES2015 +]. Memiliki gotcha:+""
adalah0
, tidakNaN
seperti yang Anda harapkan.Number(str)
- Tepat seperti konversi implisit (misalnya, seperti unary di+
atas), tetapi lebih lambat pada beberapa implementasi. (Bukan berarti itu penting.)sumber
parseInt
pertama digunakantoString
pada argumen pertama? Itu masuk akal.parseInt
algoritma: ecma-international.org/ecma-262/7.0/…123e-2
memberi1
karena berubah menjadi1.23
pertama, dan kemudian parsing berhenti pada titik desimal?NumberFormatException
waktu.parseInt
(memaksa argumen pertama untuk string) masuk akal. TujuannyaparseInt
adalah untuk mengurai string ke seluruh nomor. Jadi, jika Anda memberikannya sesuatu yang bukan string, mendapatkan representasi string untuk memulai dengan masuk akal. Apa yang dilakukannya setelah itu adalah keseluruhan cerita nother ...Untuk alasan yang sama itu
Dalam dokumen tersebut ,
parseInt
ambil string. DanJadi
16
,,8
atau'1foobar'
dikonversi terlebih dahulu ke string.Kemudian
Berarti itu mengkonversi ke mana ia bisa. The
6
,,8
danfoobar
diabaikan, dan hanya apa yang sebelumnya yang dikonversi. Jika tidak ada apa-apa,NaN
dikembalikan.sumber
Beberapa contoh lagi:
sumber