Why don't number literals have access to Number methods? [duplicate]

If you look at the ECMAScript 3 specification you will see that primitive value types Null and Undefined don't have accompanying Null and Undefined Objects.

>> Null
ReferenceError: Null is not defined

The other primitive value types Number, String and Boolean types do have accompanying Number, String and Boolean objects which you can reference from global scope.

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

The purpose for these primitive value types is to provide methods such as toString and valueOf for their respective primitive value types:

>>var n = 1;

is the same as

>>var n = 1;

Booleans and strings also work that way:

>>var b = true;

You can see that the primitive value objects are using the methods of their accompanying object when you try to mix types:

TypeError: Boolean.prototype.toString is not generic
TypeError: Number.prototype.toString is not generic

Interestingly enough for boolean and string literal types, you can call these methods directly from the literal:


Primitive values null and undefined, since they don't have accompanying Null and Undefined objects cannot do these things:

ReferenceError: Null is not defined
TypeError: Cannot call method 'toString' of null

Primitive value type number behaves like a mix of the two. You can call toString on a literal if you directly use the Number's prototype object's method:


But you cannot access the method from the literal itself like you can with strings and booleans:

SyntaxError: Unexpected token ILLEGAL

Why is it that number literals behave differently from boolean and string even though there's a Number object?



You can access it the same way, it's a different parsing issue here, to do it, use a slightly different syntax:


Numbers can have decimals, so the syntax for ending in a decimal is a bit ambiguous when you go to parse the code, use parenthesis to be valid. It's a bit clearer when you see that this is also valid:


However with just 1.toString() it's trying to parse as a number with a decimal, and it fails.


Null (capital N) is a variable name. Reserved words are case sensitive. null is the object null. typeof null === "object" //true


I think you'll find an answer to your question in this answer to another Stack Overflow question. To summarize Theo's answer:

[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[.]


Recent Questions

Top Questions

Home Tags Terms of Service Privacy Policy DMCA Contact Us

©2020 All rights reserved.