Number()vs new Number()?

时间:2013-12-22 21:51:58

标签: javascript object prototype

我正在尝试理解写m = Number()(导致typeof m评估为"number")与m = new Number()(导致typeof m评估为"object")。

我原本预计它会成为object。我只是搞乱了,我在.helloWorld()原型中添加了Number方法,无论使用哪种方法实例化它,我都可以在m上访问它。

这有什么区别?在撰写Number()new Number()之间,我在做什么?为什么一个是object而另一个是number

2 个答案:

答案 0 :(得分:4)

Number()本身返回一个数字原语。当您致电new Number()时,您会收到一个代表Numberrelevant ES5 spec)的对象的新实例。

当您在基元上调用属性时,该基元会自动装箱(就像在Java中一样)到该对象的实例,这样您就可以在helloWorld()上调用objectnumber

然而,试试这个;

var x = Number(5);
x.bar = function (x) { alert(x); };
x.bar("hello");

var y = new Number(5);
y.bar = function (x) { alert(x); };
y.bar("hello");

你会看到后者有效但前者没有;在第一个中,number被自动装箱到一个数字,并且bar方法被添加到它(对象)。当您致电x.bar()时,您正在创建自动装箱号码,bar不存在。

在后者中,您将向该Number实例添加bar方法,该方法的行为与任何其他Object实例相同,因此它在对象的整个生命周期中都会持续存在。

答案 1 :(得分:3)

这就是它的实施方式。在没有new的情况下调用时,此特定构造函数返回原始数字。使用new调用时,它将返回对象包装的数字。

您可以在基元上访问原型方法/属性,因为在幕后,JavaScript会将它们转换为对象,调用原型方法,然后抛弃对象副本。这允许您执行以下操作:

var myString = "foo";
console.log( myString.length ); //=> 3
console.log( typeof myString ); //=> "string"

在第2行创建基元的对象副本,检查对象的length属性,然后丢弃对象副本。 myString保留为字符串原语。

相关问题