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
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
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 kembali NaN
.
parseInt(8, 3)
berarti "parse "8"
in base 3" (perhatikan bahwa ia mengonversi angka 8
menjadi string; perincian dalam spesifikasi ). Tapi dalam basis 3, nomor satu digit hanya 0
, 1
, dan 2
. Ini seperti memintanya untuk menguraikan "9"
dalam oktal. Karena tidak ada karakter yang valid, Anda dapat NaN
.
parseInt(16, 3)
memintanya untuk menguraikan "16"
dalam basis 3. Karena ia dapat menguraikan 1
, itu, dan kemudian berhenti pada 6
karena tidak dapat menguraikannya. Jadi ia kembali 1
.
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. Begitu parseInt("10x")
juga 10
; yang x
diabaikan. Mendukung argumen radix (angka dasar) opsional, demikian parseInt("15", 16)
juga 21
( 15
dalam hex). Jika tidak ada radix, asumsikan desimal kecuali string dimulai dengan 0x
(atau 0X
), dalam hal ini dilewati dan diasumsikan hex. (Beberapa browser digunakan untuk memperlakukan string yang dimulai dengan 0
oktal; perilaku itu tidak pernah ditentukan, dan secara khusus tidak diizinkan dalam spesifikasi ES5.) Kembali NaN
jika tidak ditemukan angka yang dapat diuraikan .
parseFloat(str)
- Suka parseInt
, tetapi apakah angka floating-point dan hanya mendukung desimal. Lagi karakter tambahan pada string diabaikan, begitu parseFloat("10.5x")
juga 10.5
( x
diabaikan). Karena hanya desimal yang didukung, parseFloat("0x15")
adalah 0
(karena parsing berakhir pada x
). Kembali NaN
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 pemimpin 0
sebagai oktal, tetapi tidak dalam mode ketat). +"10x"
adalah NaN
karena x
ini tidak diabaikan. +"10"
is 10
, +"10.5"
is 10.5
, +"0x15"
is 21
, +"0o10"
is 8
[ES2015 +]. Memiliki gotcha: +""
adalah 0
, tidak NaN
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.)
parseInt
pertama digunakan toString
pada argumen pertama? Itu masuk akal.
parseInt
algoritma: ecma-international.org/ecma-262/7.0/…
123e-2
memberi 1
karena berubah menjadi 1.23
pertama, dan kemudian parsing berhenti pada titik desimal?
NumberFormatException
waktu.
parseInt
(memaksa argumen pertama untuk string) masuk akal. Tujuannya parseInt
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
>> parseInt('1foobar',3)
<- 1
Dalam dokumen tersebut , parseInt
ambil string. Dan
Jika string bukan string, maka itu dikonversi ke string
Jadi 16
,, 8
atau '1foobar'
dikonversi terlebih dahulu ke string.
Kemudian
Jika
parseInt
menemukan karakter yang bukan angka dalam radix yang ditentukan, ia mengabaikannya dan semua karakter berikutnya
Berarti itu mengkonversi ke mana ia bisa. The 6
,, 8
dan foobar
diabaikan, dan hanya apa yang sebelumnya yang dikonversi. Jika tidak ada apa-apa, NaN
dikembalikan.
/***** Radix 3: Allowed numbers are [0,1,2] ********/
parseInt(4, 3); // NaN - We can't represent 4 using radix 3 [allowed - 0,1,2]
parseInt(3, 3); // NaN - We can't represent 3 using radix 3 [allowed - 0,1,2]
parseInt(2, 3); // 2 - yes we can !
parseInt(8, 3); // NaN - We can't represent 8 using radix 3 [allowed - 0,1,2]
parseInt(16, 3); // 1
//'16' => '1' (6 ignored because it not in [0,1,2])
/***** Radix 16: Allowed numbers/characters are [0-9,A-F] *****/
parseInt('FOX9', 16); // 15
//'FOX9' => 'F' => 15 (decimal value of 'F')
// all characters from 'O' to end will be ignored once it encounters the out of range'O'
// 'O' it is NOT in [0-9,A-F]
Beberapa contoh lagi:
parseInt('45', 13); // 57
// both 4 and 5 are allowed in Radix is 13 [0-9,A-C]
parseInt('1011', 2); // 11 (decimal NOT binary)
parseInt(7,8); // 7
// '7' => 7 in radix 8 [0 - 7]
parseInt(786,8); // 7
// '78' => '7' => 7 (8 & next any numbers are ignored bcos 8 is NOT in [0-7])
parseInt(76,8); // 62
// Both 7 & 6 are allowed '76' base 8 decimal conversion is 62 base 10