2010-10-28 21 views
27

Si observa la especificación ECMAScript 3, verá que los tipos de valores primitivos Null y Undefined no tienen objetos Null y Undefined acompañantes.¿Por qué los literales de los números no tienen acceso a los métodos numéricos?

>> Null 
ReferenceError: Null is not defined 

Los otros tipos de valor primitivo número, cadena y tipos de Boole ¿Tiene Número acompaña, cuerdas y objetos de Boole, que se puede hacer referencia de ámbito global.

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

El propósito de estos tipos de valor primitivo es proporcionar métodos tales como toString y valueOf por sus respectivos tipos de valores primitivos:

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

es la misma que

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

booleanos y las cadenas también funcionan de esta manera:

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

Se puede ver que los objetos de valor primitivos están utilizando los métodos de su objeto que acompaña al intentar mezclar tipos:

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

Curiosamente para este tipo de literales booleanos y de cadena, puede llamar a estos métodos directamente desde lo literal:

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

los valores primitivos nula e indefinido, ya que no tienen que acompaña objetos nulos y no definidos no puede hacer estas cosas:

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

El número de tipo de valor primitivo se comporta como una mezcla de los dos. Puede llamar toString en un literal si se utiliza directamente el método de objeto prototipo del Número:

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

Pero no se puede acceder al método de lo literal en sí como se hace con las cadenas y booleanos:

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

Por qué ¿Es que los literales numéricos se comportan de forma diferente de booleanos y de cadenas aunque haya un objeto Number?

+0

ver también [¿Por qué no puedo acceder a una propiedad de un entero con un solo punto?] (http://stackoverflow.com/q/9380077/1048572) – Bergi

+0

Oh, buenos puntos. No estaba seguro Esa otra publicación tenía buena información. ¡Gracias! –

Respuesta

33

Usted puede acceder a ella de la misma manera, se trata de una cuestión de análisis diferente aquí, para hacerlo, utilice una sintaxis ligeramente diferente:

(1).toString() 

Los números pueden tener decimales, por lo que la sintaxis para que termina en una el decimal es un poco ambiguo cuando vas a analizar el código, usa paréntesis para que sea válido. Es un poco más claro cuando se ve que esto también es válido:

(1.).toString() 

Sin embargo con sólo 1.toString() que está tratando de analizar como un número decimal con un , y falla.

+0

No consideré probarlo con(). Ojalá pudiera marcar dos respuestas como respuestas. Entonces, básicamente, el literal tiene la propiedad, pero solo tiene que lidiar con la sintaxis decimal adicional. ¡Gracias! –

+7

1..toFixed (2), 1.0.toFixed (2) funcionan sin paréntesis. – kennebec

+0

@kennebec - Sí, funcionarán también, transmití más que '(anyType) .toString()' sería un formato consistente que funcionaría, lo siento si eso no estaba del todo claro ... no lo hice significa dar a entender que no hubo alternativas para los números específicamente. –

5

Creo que encontrará una respuesta a su pregunta en this answer a otra pregunta sobre el desbordamiento de la pila.Para resumir Theo 's respuesta:

[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

¡Guau! Pensé que tenía algo que ver con el decimal, pero pensé que sería más. Interesante, mira, me alegro de haber preguntado. –

0

nulo (N mayúscula) es un nombre de variable. Las palabras reservadas distinguen mayúsculas de minúsculas. null es el objeto nulo. typeof null === "object" // true

+0

'null.toString()' -> * TypeError no detectada: No se puede leer la propiedad 'toString' de null * –

Cuestiones relacionadas