为什么原始变量像对象一样?

时间:2016-02-28 08:31:54

标签: javascript

如果我们将一个方法添加到数字函数(或布尔或字符串),就像这样

Number.prototype.sayMyNumber = function(){
    return "My number is " + this;
}

然后创建一个数字对象,将其分配给变量

var num1 = new Number(34); 
num1.sayMyNumber(); // it says "My number is 34"

这很好,并且在我们创建' Number'对象

同样,如果我创建一个原始变量

num2 = 34;
num2.sayMyNumber(); // it says "My number is 34"

令人惊讶的是,num2也有一个方法sayMyNumber(),即使我们没有显式创建一个Number对象。

然后我尝试了这样,

34.sayMyNumber(); // error, this does not work 

为什么num2有效?

更新

这是我在评论部分提出的跟进问题,我将其放在此处以提高可见度

下面的答案提到num2被认为是'数字'对象内部。这进一步让我感到困惑。

typeof num1 === "number" // returns false
typeof num2 === "number" // returns true

typeof num1 === "object" // returns true
typeof num2 === "object" // returns false

这是否意味着num2不是"对象" ? 如果它不是"对象"那怎么可能是' Number' ?

3 个答案:

答案 0 :(得分:3)

基本类型 Number 具有相应的对象表示,您可以使用new Number创建该表示。这是对象,因此与基本类型 Number 数据类型不同。

如果您致电Number(34)(没有new),则不会创建对象,但数字函数会执行类型转换,而不是原始数字值。

var num1 = new Number(34); // object
var num2 = 34; // primitive

当您在原始编号sayMyNumber()上调用num2时,JavaScript会在内部将原始内容临时转换为其等效对象版本。由于您已将sayMyNumber()添加到Number.prototype,因此您可以访问该功能。

34.sayMyNumber()不起作用的原因是因为当JavaScript引擎解析您的源代码时,它必须解释一个点在给定上下文中的含义。在34.sayMyNumber()的情况下,点可能是模糊的。它是指小数分隔符吗?或者它是否意味着对象成员访问? JavaScript选择解释所有整数,后跟一个点作为浮点数的一部分。但由于没有这样的数字34.sayMyNumber(),它会引发一个SyntaxError。 Read more here

答案 1 :(得分:-2)

JavaScript在基元和对象之间强制执行。在这种情况下,数值被强制转换为Number对象,以便访问原型方法sayMyNumber。实际上,通过这种方式,基元可以访问由它们各自的对象构造函数定义的所有属性和方法。但是,它们与对象不同,因为它们是不可变的。

因此,(34).sayMyNumber();有效; (34).toFixed()(34).toPrecision()也是如此。

至于34.sayMyNumber();,正如最后指出的那样,是语法错误。

答案 2 :(得分:-3)

对于两者,

var num1 = new Number(34); 
num2 = 34;

您要为"Number"num1变量分配num2类型值。所以它调用原型,它附加到"Number"

但是调用34.sayMyNumber有语法错误,这是非法的声明。

如果有人对此有疑问,请参阅... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number