JavaScript中的“new Number(...)”和“Number(...)”有什么区别?

时间:2010-03-04 17:32:35

标签: javascript language-features language-design

在Javascript中,其中一个reliable ways to convert a string to a numberNumber构造函数:

var x = Number('09'); // 9, because it defaults to decimal

受到this question的启发,我开始疑惑 - 上述内容之间有什么区别:

var x =new Number('09');

Number肯定看起来更好,但似乎对构造函数的使用略显不合适。没有,是否有任何副作用或使用它的任何差异?如果没有差异,为什么不,的目的是什么?

4 个答案:

答案 0 :(得分:10)

在第一种情况下,您正在使用Number Constructor Called as a Function,如规范中所述,它只会执行类型转换,并返回Number原语。

在第二种情况下,您使用Number Constructor制作 Number对象

var x = Number('09');
typeof x; // 'number'

var x = new Number('09');
typeof x; // 'object'

Number('1') === new Number('1'); // false

差异可能很微妙,但我认为注意包装对象如何对原始值起作用非常重要。

答案 1 :(得分:4)

Number返回原始数字值。是的,你可以将构造函数用作普通函数,这有点奇怪,但这就是JavaScript的定义方式。大多数语言内置类型都有奇怪且不一致的额外功能,如下所示。

new Number构造一个明确的盒装Number对象。区别:

typeof Number(1)      // number
typeof new Number(1)  // object

与Java的盒装原始类相比,在JavaScript中,显式Number对象绝对没有用

我不打算使用Number。如果您想要明确,请使用parseFloat('09');如果你想要简洁,请使用+'09';如果您只想允许整数,请使用parseInt('09', 10)

答案 2 :(得分:0)

的SpiderMonkey-1.7.0:

js> typeof new Number('09');
object
js> typeof Number('09');
number

答案 3 :(得分:0)

数字(没有新的)似乎并不完全在原语中。在下面的示例中,调用anyMethod()(如果在Number原型中)。

Number(3).anyMethod()

尽管

3.anyMethod()

无效。