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 parseIntdel tuo vero codice, ma non di quello sopra.
Number('08')
0o undefinede il numero della stringa inizia con una 0cifra non seguita da un xo 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)