2015-05-21 20 views
73

Questo è strano. Questo è ciò che accade nella console JavaScript di Chrome (versione 42.0.2311.135, 64-bit).Perché 00.0 causa un errore di sintassi?

> 0 
< 0 
> 00 
< 0 
> 0.0 
< 0 
> 00.0 
X Uncaught > SyntaxError: Unexpected number 

Firefox 37.0.2 fa lo stesso, anche se il suo messaggio di errore è:

SyntaxError: missing ; before statement 

C'è probabilmente qualche spiegazione tecnica per quanto riguarda il modo in cui JavaScript analizza i numeri, e forse può accadere solo quando armeggiare al prompt della console, ma sembra ancora sbagliato.

Perché si fa?

+13

E qui ho pensato di aver visto tutti i * WTF * del linguaggio ... E io al i modi godono i momenti successivi. –

+2

Questo non è un problema che si verifica solo nella console, 'var i = 00.0;' genererà sempre un SytaxError. – pstenstrm

+3

AFAIK in JS float literal dovrebbe contenere ** decimale ** intero. Zeri indica intero _octal_ ([ref.] (Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Integers)) – hindmost

risposta

77

Le espressioni 0.0 e 00.0 vengono analizzati in modo diverso.

  • 0.0 viene analizzato come un letterale numerico
  • 00.0 viene analizzato come:
    • 00 - ottale letterale numerico
    • . - proprietà di accesso
    • 0 - nome identificativo

Il codice genera errore di sintassi perché 0 non è un identificatore JavaScript valido. Il seguente esempio funziona poiché toString è un identificatore valido:

00.toString 

Section 7.8.3 - 0 iniziale può essere seguita da separatore decimale o ExponentPart
Section B.1.1 - 0 iniziale può essere seguita da OctalDigits

+18

Si noti che da 00.0 a 07.0 si genera un'eccezione, tuttavia 08.0 e 09.0 sono perfettamente validi a causa di come il motore non li riconosce come ottali, quindi li parano come numeri decimali. –

+0

@ChadSchouggins È curioso che le cifre "8" e "9" siano sufficienti per dire al parser che è un numero decimale piuttosto che un numero ottale, mentre un punto _decimale non lo è. Questo è ciò che deriva dal sovraccarico ". Credo. Avrei implementato il parser in modo diverso ... (ero abbastanza brillante per implementare un parser a tutti). –

22

00 viene valutato come un numero ottale e .0 viene valutato come accesso alla proprietà di quel numero. Ma poiché gli interi non possono essere usati come accessor di proprietà, viene generato l'errore.

si ottiene lo stesso errore per qualsiasi altro oggetto:

'string'.0 // Syntax error: unexpected number 
({}).0 // Syntax error: unexpected number 

Si possono trovare informazioni relative a accesso alle proprietà su MDN.

+7

Nelle ultime specifiche l'ottale letterale inizia con '0o'. Tuttavia, a causa della compatibilità con le versioni precedenti, è improbabile che la vecchia sintassi venga rimossa dall'implementazione del browser. – Leo

+0

Buono. Se trovi alcuni documenti su cui sentirti libero di modificare la risposta per includere tali informazioni e link - potrebbe essere utile per i futuri lettori! –

+0

Probabilmente dovresti rimuovere la parte errata o, probabilmente meglio, modificarla/riscriverla per essere corretta ... e riscriverla invece di aggiungere (cioè non avere un blocco "Modifica" separato in alto/in basso, ma invece riscrivere la risposta integrare senza problemi le nuove informazioni aggiunte) è generalmente migliore in termini di valore a lungo termine. – Dukeling

Problemi correlati