Spróbuj wykonać następujące czynności w JavaScript:
parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!
Właśnie dowiedziałem się na własnej skórze, że JavaScript uważa, że zera wskazuje ósemkowy całkowitą , a ponieważ nie jest "8"
ani "9"
w bazie-8, funkcja zwraca zero. Czy ci się to podoba, czy nie, jest to zgodne z projektem .
Jakie są obejścia?
Uwaga: Ze względu na kompletność, zamierzam opublikować rozwiązanie, ale nienawidzę tego rozwiązania, więc proszę o publikowanie innych / lepszych odpowiedzi.
Aktualizacja:
Piąta edycja standardu JavaScript ( ECMA-262 ) wprowadza przełomową zmianę, która eliminuje to zachowanie. Mozilla ma dobre write-up .
10
(dziesiętną), chyba że przed analizowanym numerem jest poprzedzony 0x
np. 0xFF
W takim przypadku parametr podstawowy ma wartość 16. Mam nadzieję, że pewnego dnia ten problem będzie odległym wspomnieniem.
+'08' === 8
? Prawdziwe! Może naprawdę potrzebujesz parseInt
prawdziwego kodu, ale nie powyższego.
Number('08')
0
lub undefined
a liczba łańcucha rozpoczyna się 0
cyfrą, po której nie następuje znak „ x
lub” X
, a następnie implementacja może, według własnego uznania, interpretować liczbę jako ósemkową lub dziesiętną. Zachęca się implementacje do interpretowania liczb w tym przypadku jako dziesiętnych. ” ( mój nacisk)