SpiderMonkey-1.7.0:
js> typeof new Number('09');
object
js> typeof Number('09');
number
SpiderMonkey-1.7.0:
js> typeof new Number('09');
object
js> typeof Number('09');
number
In the first case, you are using the Number Constructor Called as a Function, as described in the Specification, that will simply perform a type conversion, returning you a Number
primitive.
In the second case, you are using the Number
Constructor to make a Number
object:
var x = Number('09');
typeof x; // 'number'
var x = new Number('09');
typeof x; // 'object'
Number('1') === new Number('1'); // false
The difference may be subtle, but I think it's important to notice how wrapper objects act on primitive values.
Number
returns a primitive number value. Yeah, it's a bit odd that you can use a constructor function as a plain function too, but that's just how JavaScript is defined. Most of the language built-in types have weird and inconsistent extra features like this thrown in.
new Number
constructs an explicit boxed Number
object. The difference:
typeof Number(1) // number
typeof new Number(1) // object
In contrast to Java's boxed primitive classes, in JavaScript explicit Number
objects are of absolutely no use.
I wouldn't bother with either use of Number
. If you want to be explicit, use parseFloat('09')
; if you want to be terse, use +'09'
; if you want to allow only integers, use parseInt('09', 10)
.