2010-10-28 13 views
27

Se si osservano le specifiche ECMAScript 3, i tipi di valori primitivi Null e Undefined non hanno gli oggetti Null e Undefined di accompagnamento.Perché i letterali numerici non hanno accesso ai metodi numerici?

>> Null 
ReferenceError: Null is not defined 

Gli altri tipi di valore primitivo numero, una stringa e tipi booleani ce l'ho, Numero di accompagnamento, String e gli oggetti booleani che è possibile fare riferimento da portata globale.

>>Number 
function Number() { [native code] } 
>>Boolean 
function Boolean() { [native code] } 

Lo scopo di questi tipi di valore primitivo è quello di fornire metodi come toString e valueOf per i rispettivi tipi di valore primitivo:

>>var n = 1; 
>>n.toString(); 
"1" 

è uguale

>>var n = 1; 
>>Number.prototype.toString.call(n); 
"1" 

booleani e stringhe funzionano anche in questo modo:

>>var b = true; 
>>b.toString(); 
"true" 
>>Boolean.prototype.toString.call(b); 
"true" 

Si può vedere che gli oggetti di valore primitivo stanno usando i metodi di oggetto che accompagna quando si tenta di mescolare tipi:

>>Boolean.prototype.toString.call(n); 
TypeError: Boolean.prototype.toString is not generic 
>>Number.prototype.toString.call(b) 
TypeError: Number.prototype.toString is not generic 

abbastanza interessante per i tipi di letterali booleani e stringhe, è possibile chiamare questi metodi direttamente da letterale:

>>true.toString(); 
"true" 
>>Boolean.prototype.toString.call(true) 
"true" 
>>"moo".toString(); 
"moo" 
>>String.prototype.toString.call("moo") 
"moo" 

valori primitivi nullo e indefinito, poiché non hanno accompagnamento oggetti nulli e non definiti non possono fare queste cose:

>>Null 
ReferenceError: Null is not defined 
>>null.toString() 
TypeError: Cannot call method 'toString' of null 

Il numero del tipo di valore primitivo si comporta come un mix dei due. È possibile chiamare toString su un letterale, se si utilizza direttamente il metodo dell'oggetto prototipo del numero:

>>Number.prototype.toString.call(1); 
"1" 

Ma non si può accedere al metodo dal letterale stesso come si può con le stringhe e booleani:

>>1.toString() 
SyntaxError: Unexpected token ILLEGAL 

Perché è che i numeri letterali si comportano in modo diverso da booleano e stringa anche se c'è un oggetto Numero?

+0

vedi anche [Perché non riesco ad accedere a una proprietà di un intero con un singolo punto?] (http://stackoverflow.com/q/9380077/1048572) – Bergi

+0

Oh, buoni punti. Non ero sicuro Quell'altro post aveva buone informazioni. Grazie! –

risposta

33

È possibile l'accesso allo stesso modo, si tratta di un problema di analisi diverso qui, per farlo, usare una sintassi leggermente diversa:

(1).toString() 

I numeri possono avere decimali, quindi la sintassi per che termina in un decimale è un po 'ambiguo quando si va ad analizzare il codice, utilizzare la parentesi per essere valido. E 'un po' più chiaro quando si vede che questo è valido anche:

(1.).toString() 

Tuttavia, con solo 1.toString() si sta cercando di analizzare come numero con un decimale, e non riesce.

+0

Non ho pensato di provarlo con(). Vorrei poter contrassegnare due risposte come risposte. Quindi in pratica il letterale ha la proprietà, ma devi solo occuparti della sintassi decimale in più. Grazie! –

+7

1..toFixed (2), 1.0.toFixed (2) funziona senza parven. – kennebec

+0

@kennebec - Sì, funzioneranno pure, stavo più comunicando che '(anyType) .toString()' sarebbe un formato coerente che avrebbe funzionato, scusa se non era del tutto chiaro ... non significa sottintendere che non c'erano alternative per i numeri in particolare. –

5

Penso che troverai una risposta alla tua domanda nello this answer in un'altra domanda di overflow dello stack.Per riassumere la risposta s' Theo:

[T]he parser expects a number followed by a dot to be a floating point literal. [...] [Y]ou only have to add another dot to make it work[.]

+0

Wow! Ho pensato che avesse qualcosa a che fare con il decimale, ma ho pensato che ci sarebbe stato di più. Interessante, vedi sono contento di averlo chiesto. –

0

Null (N maiuscola) è un nome di variabile. Le parole riservate sono case sensitive. null è l'oggetto null. typeof null === "oggetto" // true

+0

'null.toString()' -> * Unchaught TypeError: Impossibile leggere la proprietà 'toString' di null * –

Problemi correlati