JavaScript中"new Number(...)"和"Number(...)"有什么区别?

10

在JavaScript中,将一个字符串转换为数字的一种可靠方式是使用Number构造函数:

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

这个问题 的启发,我开始想知道 —— 上述代码和下面的代码有什么区别:

var x =new Number('09');

Number看起来确实更好,但是似乎使用构造函数有些不恰当。如果没有使用new会有什么副作用或区别吗? 如果没有区别,那么为什么会这样,new的目的是什么?

4个回答

14
在第一种情况下,您使用的是作为函数调用的数字构造函数,如规范所述,它将仅执行类型转换,返回一个Number原始值。
在第二种情况下,您使用的是Number构造函数来创建一个Number对象
var x = Number('09');
typeof x; // 'number'

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

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

差别可能是微妙的,但我认为注意到包装对象如何作用于原始值是很重要的。


1
公平地说,new Number('1') === new Number('1') 也是 false,但我同意你的观点 :) - Richard Szalay
1
没错,因为这将比较两个不同的对象引用。 - Christian C. Salvadó
@Richard Szalay - 但是,Number('1') === Number('1')true,这证明了 @CMS 的观点。 - Nicole

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)

+1,真希望我能接受两个回答都正确,因为它们都是完全正确的,并且提供了独特而有用的信息。我之前不知道可以在+之前不加数字使用它。 - Nicole

0

没有使用 new 关键字的 Number 似乎不能准确地返回一个原始值。在下面的示例中,如果在 Number 原型中调用 anyMethod() 方法,则会出现这种情况。

Number(3).anyMethod()

然而

3.anyMethod()

无法工作。


0

SpiderMonkey-1.7.0:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接