Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

javascript

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.

>>Number function Number() { [native code] } >>Boolean 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; >>n.toString(); "1"  

is the same as

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

Booleans and strings also work that way:

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

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

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

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

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

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

>>Null ReferenceError: Null is not defined >>null.toString() 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:

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

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

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

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

like image 880
Bjorn Avatar asked Oct 28 '10 19:10

Bjorn


People also ask

What is number literal?

A numeric literal is a character-string whose characters are selected from the digits 0 through 9, a sign character (+ or -), and the decimal point. If the literal contains no decimal point, it is an integer.

What is a number literal in Javascript?

A decimal integer literal is a sequence of digits without a leading 0 (zero). A leading 0 (zero) on an integer literal, or a leading 0o (or 0O ) indicates it is in octal. Octal integer literals can include only the digits 0 – 7 . A leading 0x (or 0X ) indicates a hexadecimal integer literal.


1 Answers

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

(1).toString() 

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:

(1.).toString() 

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

like image 191
Nick Craver Avatar answered Oct 19 '22 17:10

Nick Craver