Javascript parseInt () dengan nol di depan

120

Fungsi parseInt Javascript tampaknya tidak berfungsi sepenuhnya.

parseInt("01") returns 1
parseInt("02") returns 2
parseInt("03") returns 3
parseInt("04") returns 4
parseInt("05") returns 5
parseInt("06") returns 6
parseInt("07") returns 7
parseInt("08") returns 0
parseInt("09") returns 0

Anda tidak bisa menjelaskannya. Cobalah. (jsFiddle)

Sunting Sejak pertanyaan ini ditanyakan dan dijawab, "fitur" dari default ke oktal radix sudah tidak digunakan lagi. [ 1 ] [ 2 ]

penyelamat
sumber
29
Anda pasti bercanda
georg
6
You can't explain that. Ya, Anda dapat => developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Rocket Hazmat
3
Sejak usia, angka apa pun yang dimulai dengan 0 mewakili OCTAL dan 0x mewakili Hexa-Desimal. Saya percaya ini universal untuk semua bahasa, tetapi sekali lagi saya mungkin salah.
Selvakumar Arumugam
3
FYI: jsFiddle , online lebih baik tester JavaScript daripada w3schools.com/jsref/tryit.asp .
Rocket Hazmat
2
@JohnHartsock Ya, itu karena kami berdua ada di pos ini stackoverflow.com/questions/8761997/…
penyelamat

Jawaban:

181

Ini karena jika sebuah bilangan dimulai dengan '0', itu diperlakukan sebagai basis 8 (oktal).

Anda dapat memaksa basis dengan melewatkan basis sebagai parameter ke-2.

parseInt("09", 10) // 9

Menurut dokumen , parameter kedua adalah opsional, tetapi tidak selalu dianggap 10, seperti yang Anda lihat dari contoh Anda.

Roket Hazmat
sumber
1
ya, tapi jika diasumsikan oktal, itu harus mengembalikan 11 untuk 09 bukan 0.
Peeyush Kushwaha
2
@PeeyushKushwaha: Sebaliknya. 11di basis 8 ada 9di basis 10. 09bukan bilangan basis 8 yang valid.
Rocket Hazmat
Tapi saya ingin 09 setelah parseInt, apakah ada jalan lain
Pardeep Jain
39

Panggilan ke parseIntharus selalu menentukan basis dalam argumen kedua:

parseInt("08", 10);

Versi JavaScript sebelumnya memperlakukan string yang dimulai dengan 0oktal (bila tidak ada basis yang ditentukan) dan tidak 08juga09 bilangan oktal yang valid.

Dari dokumentasi Mozilla :

Jika radix tidak ditentukan atau 0, JavaScript mengasumsikan yang berikut:

  • Jika string input dimulai dengan "0x" atau "0X", radix adalah 16 (heksadesimal).
  • Jika string input dimulai dengan "0", radix adalah delapan (oktal). Fitur ini tidak standar, dan beberapa implementasi sengaja tidak mendukungnya (alih-alih menggunakan radix 10). Untuk alasan ini, selalu tentukan radix saat menggunakan parseInt .
  • Jika string input dimulai dengan nilai lain, radix-nya adalah 10 (desimal).

Jika karakter pertama tidak dapat diubah menjadi angka, parseInt mengembalikan NaN.

Dan dari standar ECMAScript 3 :

Ketika radix adalah 0 atau tidak terdefinisi dan nomor string dimulai dengan digit 0 tidak diikuti oleh x atau X , maka implementasi dapat, atas kebijakannya sendiri, menafsirkan bilangan tersebut sebagai oktal atau sebagai desimal. Penerapan didorong untuk menafsirkan angka dalam kasus ini sebagai desimal.

Versi terbaru JavaScript ( ECMAScript 5 ) mengabaikan perilaku ini , tetapi Anda masih harus menentukan radix untuk memenuhi browser lama.

Wayne
sumber
Karena ini sudah usang, di masa depan Anda akan baik-baik saja dengan menggunakan nol di depan bukan?
Pacerier
15

Ada parameter Radix

parseInt(value, base)

Dimana basis adalah radix.

Dalam hal ini Anda mengevaluasi bilangan basis10 (desimal), oleh karena itu gunakan

parseInt(value, 10);
John Hartsock
sumber
4

Ini sepertinya tidak sepenuhnya valid di browser baru. Internet Explorer 9 dan 10 akan mengembalikan 8 jika Anda menjalankan 'parseInt ("08")' sedangkan Internet Explorer 8 dan versi sebelumnya akan mengembalikan 0 (IE10 dalam mode quirks juga akan mengembalikan 0).

Chrome versi terbaru juga menampilkan 8 sehingga interpretasinya pasti telah berubah baru-baru ini.

Maffelu
sumber
Ya, perilakunya sudah berubah. Saya akan memperbarui jawaban saya. developer.mozilla.org/en-US/docs/JavaScript/Reference/…
Wayne
1
Ya, Firefox dan Chrome versi terbaru tidak bermasalah sekarang.
mythicalcoder
3

Masalah ini sudah tidak berlaku lagi sekarang. Tetapi Anda masih dapat menggunakan radix in parseIntuntuk mengubah jumlah basis lainnya menjadi basis 10. Misalnya,

var baseTwoNumber = parseInt('0010001', 2);

kembali 17(yang merupakan basis 10 dari 0010001).

Muhammad Imran
sumber
0

Tip: Seperti yang sekarang Anda ketahui saat default ke oktal sudah tidak digunakan lagi. Berikut adalah cara Anda memperbaikinya di browser lama

// ES-5 15.1.2.2
if (parseInt('08') !== 8 || parseInt('0x16') !== 22) {
    parseInt = (function (origParseInt) {
        var hexRegex = /^0[xX]/;
        return function parseIntES5(str, radix) {
            str = String(str).trim();
            if (!Number(radix)) {
                radix = hexRegex.test(str) ? 16 : 10;
            }
            return origParseInt(str, radix);
        };
    }(parseInt));
}
Tak ada habisnya
sumber
PS: jika Anda hanya menggunakan angka konstan dengan awalan nol (bukan string), itu masih diperlakukan sebagai basis 8 di semua browser saat ini.
Agamemnus
0

Masalahnya sekarang tampaknya telah berubah di sebagian besar browser.

Firefox 51.0.1 (64-bit)

parseInt("09")   // 9

Chrome 55.0.2883.95 (64-bit)

parseInt("09")   // 9

Safari 10.0 (12602.1.50.0.10)

parseInt("09")   // 9

=====

Latihan yang Direkomendasikan

Karena itu, hanya untuk berada di sisi yang lebih aman dan menghindari masalah, gunakan parameter base / radix seperti yang disarankan dalam jawaban yang diterima .

parseInt("09", 10)    // 9

Tes ekstra

Saya hanya ingin menguji ini juga, jika argumennya bukan string. Chrome & Safari memberikan hasil yang tepat. Firefox juga memberikan hasil yang tepat, tetapi dengan peringatan.

parseInt(09)     // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)
penulis mitos
sumber
Jika nilainya dimulai dengan 0 dan berupa angka, parseInt akan tetap menggunakan basis 8. Coba parseInt (020)
sirrocco
Iya. Saya bahkan telah menunjukkan jawaban yang disarankan. Dan saya tahu praktik terbaik dan fitur buruk yang harus dihindari. Jadi saya telah memberikan latihan yang Direkomendasikan juga dalam jawaban saya.
penulis mitos