Secondo la specifica ECMAScript la parte intera di un decimale il numero dovrebbe essere zero o iniziare con una cifra diversa da zero. Un valore esadecimale dovrebbe iniziare con 0x.
Javascript, nei principali browser, estende EMCAScript per includere numeri ottali. Questi sono determinati dal fatto che una sequenza di cifre (da 0 a 7 inclusi) inizia con uno zero.
Dati questi fatti, la mia ingenua implementazione di un interprete javascript probabilmente analizzerebbe gli interi un po 'come questo:
if first_char in [1-9] then
parse_input_as_decimal()
else if first_char is 0 then
if second_char is 'x' then
parse_input_as_hexadecimal()
else if second_char in [1-7] then
parse_input_as_octal()
else
parse_input_as_zero()
Tuttavia i browser Web sembrano agire in modo un po 'strano in quanto se un numero che inizia con zero contiene le cifre 8 o 9, allora lo legge come decimale valido. Questo può portare a stranezze, specialmente quando si utilizza un punto decimale o esponente. Alcuni esempi:
011 // is octal
0011 // is octal
019 // is decimal
0091 // is decimal
011.0 // throws an error
019.0 // is decimal
011e5 // throws an error
019e5 // is decimal
La mia domanda è perché si comportano così? È solo qualche stranezza della storia? O c'è una buona ragione? È stato scritto in alcune specifiche da qualche parte? Questo cambierà mai?
So che questo è un po 'arcano e in questi giorni poche persone usano gli ottali in javascript, ma sono curioso.