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

前端之家收集整理的这篇文章主要介绍了javascript – 为什么原始变量像对象一样?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > javascript: do primitive strings have methods?2个
如果我们像这样向Number函数(或Boolean或String)添加一个方法
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在内部被视为’Number’对象.这让我更加困惑.

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

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

这不是说num2不是“对象”吗?
如果它不是“对象”那么它怎么可能是’Number’的实例呢?

解决方法

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

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

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

当您在原始数字num2上调用sayMyNumber()时,JavaScript会在内部将原始数据临时转换为其等效的对象版本.并且因为您将sayMyNumber()添加到Number.prototype,您可以访问该函数.

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

猜你在找的JavaScript相关文章