如果我们像这样向Number函数(或Boolean或String)添加一个方法
Number.prototype.sayMyNumber = function(){
return "My number is " + this;
}
Run Code Online (Sandbox Code Playgroud)
然后创建一个数字对象将其分配给变量
var num1 = new Number(34);
num1.sayMyNumber(); // it says "My number is 34"
Run Code Online (Sandbox Code Playgroud)
这很好,并且在我们创建'Number'对象时可以预期.
同样,如果我创建一个原始变量
num2 = 34;
num2.sayMyNumber(); // it says "My number is 34"
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,num2也有一个方法sayMyNumber(),即使我们没有显式创建一个Number对象.
然后我试试这样,
34.sayMyNumber(); // error, this does not work
Run Code Online (Sandbox Code Playgroud)
为什么num2有效?
更新
这是我在评论部分提出的一个跟进问题,我将其放在此处以提高可见度
下面的答案提到num2在内部被视为'Number'对象.这让我更加困惑.
typeof num1 === "number" // returns false
typeof num2 === "number" // returns true
typeof num1 === "object" // returns true
typeof num2 === "object" // returns false …Run Code Online (Sandbox Code Playgroud) 这个问题来自另一个问题,它涉及console.dir字符串文字的行为.特别是,请参阅我的回答评论.
众所周知,StringJavaScript中的对象有很多方法.这些方法是在String.prototype对象上定义的.String.prototype.toUpperCase例如.因此我们可以这样做:
var s = new String("hello"),
s2 = s.toUpperCase(); //toUpperCase is a method on String.prototype
Run Code Online (Sandbox Code Playgroud)
但是,我们也可以这样做:
var s = "hello", //s is a string literal, not an instance of String
s2 = s.toUpperCase();
Run Code Online (Sandbox Code Playgroud)
很明显,当您String.prototype在字符串文字上调用方法时,JavaScript解释器正在进行某种形式的转换/转换.但是,我在规范中找不到任何对此的引用.
这是有道理的,因为否则你必须明确地将每个字符串文字强制转换为一个String对象,然后才能使用任何方法,这将非常烦人.
所以我的问题是,这个功能在哪里描述,我是否正确假设文字值暂时转换为实例String?我是否过度思考并忽略了一些明显的东西?
在了解可选链接运算符时,我进行了一些实验,发现这两个运算符的计算结果为未定义:
false.nonExistingProperty // undefined
true.nonExistingProperty // undefined
Run Code Online (Sandbox Code Playgroud)
但为什么会这样呢?这不应该引发错误吗?
javascript ×3