相关疑难解决方法(0)

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

如果我们像这样向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)

javascript

7
推荐指数
1
解决办法
270
查看次数

为什么String.prototype的方法可用于字符串文字?

这个问题来自另一个问题,它涉及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?我是否过度思考并忽略了一些明显的东西?

javascript

5
推荐指数
1
解决办法
573
查看次数

JavaScript:为什么 false.something 的计算结果为未定义?

在了解可选链接运算符时,我进行了一些实验,发现这两个运算符的计算结果为未定义:

false.nonExistingProperty // undefined
true.nonExistingProperty // undefined
Run Code Online (Sandbox Code Playgroud)

但为什么会这样呢?这不应该引发错误吗?

javascript

4
推荐指数
1
解决办法
90
查看次数

标签 统计

javascript ×3