2013-03-17 17 views
7

Perché 2..toString() restituisce 2 ma 2.toString() genera questo errore?Perché 2..toString() funziona?

Esempio:

console.log(2..toString()); // prints 2 

// Firefox throws the error 
// `SyntaxError: identifier starts immediately after numeric literal` 
console.log(2.toString()); 

var x = 2; 
console.log(x.toString()); // prints 2 

// Firefox throws the error 
//`TypeError: XML descendants internal method called on incompatible Number` 
console.log(x..toString()); 
+0

(2) .toString() restituisce il risultato previsto. (non una risposta ma un test ...) –

+0

Anche IE dà errore? – DevelopmentIsMyPassion

+0

Lo so ma perché anche '2..toString()' funziona? –

risposta

4

2 è solo un numero, non ha alcun metodo da chiamare.

2. può essere forzato in una stringa, che è un oggetto (ad esempio '2.0'), quindi può avere il metodo.

Solo 2.toString() verrà analizzato come 2.0tostring(), che ovviamente non ha senso.

Guardando come i due vengono analizzati:

enter image description here

vs

enter image description here

Lo strumento per generare questi è qui tra l'altro: http://jsparse.meteor.com/

+3

quale strumento è? –

+0

** Trovato. Lo strumento è qui (http://jsparse.meteor.com/)** –

+2

puoi spiegare come i diagrammi indicano che il primo è sbagliato? entrambi sembrano essere in una casella numerica. Non riesco a vedere come gli schemi aiutano .... puoi rispondere? –

8

Questo perché 2. viene analizzato come 2.0, così 2..toString() è equivalente a 2.0.toString(), che è un'espressione valida.

D'altra parte, 2.toString() viene analizzato come 2.0toString(), che è un errore di sintassi.

+0

'2.' restituisce' 2' nella console di Chromium. –

+0

@ G.Kayaalp, sì, entrambi '2 === 2.0' e' 2. === 2.0' sono 'true'. –

+0

odio essere l'avvocato del diavolo qui, ma '2. === 2' è 'true' pure –

1

2..toString() sarà interpretato come 2.0.toString().

In realtà, 2. è un numero: console.log(typeof 2.); sarà elasticità: numero

2

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toString

Come l'oggetto numero sovrascrive il metodo toString dell'oggetto oggetto, è necessario prima utilizzare per esplicitamente paranthesis per indicare che è un numero e non un oggetto.

La mia ipotesi è che 2. lo definisca implicitamente come float, che è quindi in grado di utilizzare il metodo .toString() dell'oggetto Number e non il metodo dell'oggetto Object.

4
2.toString() 

L'interprete vede 2 e pensa: "Oh, un numero!" Quindi, vede il punto e pensa "oh, un numero decimale!" E poi, va al personaggio successivo e vede uno t, e viene confuso. "2.t non è un numero decimale valido", dice, poiché genera un errore di sintassi.


2..toString() 

L'interprete vede 2 e pensa: "Oh, un numero!" Quindi, vede il punto e pensa "oh, un numero decimale!" Poi, vede un altro punto e pensa "oh, immagino che fosse la fine del nostro numero. Ora, stiamo osservando le proprietà di questo oggetto (il numero 2.0)." Quindi, chiama il metodo toString dell'oggetto 2.0.

Problemi correlati