Prova a eseguire quanto segue in 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 !!
Ho appena imparato a mie spese che JavaScript pensa che lo zero iniziale indichi un numero intero ottale , e poiché non esiste "8"
o "9"
in base-8, la funzione restituisce zero. Piaccia o no, questo è di progettazione .
Quali sono le soluzioni alternative?
Nota: per completezza, sto per pubblicare una soluzione, ma è una soluzione che odio, quindi per favore pubblica altre / risposte migliori.
Aggiornare:
La 5a edizione dello standard JavaScript ( ECMA-262 ) introduce una modifica rivoluzionaria che elimina questo comportamento. Mozilla ha una buona scrittura .
10
(decimale) a meno che non sia prefissato il numero da analizzare 0x
, ad esempio 0xFF
, nel qual caso il parametro di base è impostato su 16. Si spera, un giorno, questo problema sarà un lontano ricordo.
+'08' === 8
? Vero! Forse hai davvero bisogno parseInt
del tuo vero codice, ma non di quello sopra.
Number('08')
0
o undefined
e il numero della stringa inizia con una 0
cifra non seguita da un x
o X
, quindi l'implementazione può, a sua discrezione, interpretare il numero come ottale o come decimale. Le implementazioni sono incoraggiate a interpretare i numeri in questo caso come decimali. " ( la mia enfasi)