为什么数字文字不能访问Number方法?

Bjo*_*orn 27 javascript

如果查看ECMAScript 3规范,您将看到原始值类型Null和Undefined没有伴随Null和Undefined对象.

>> Null
ReferenceError: Null is not defined
Run Code Online (Sandbox Code Playgroud)

其他原始值类型Number,String和Boolean类型都有伴随的Number,String和Boolean对象,您可以从全局范围引用它们.

>>Number
function Number() { [native code] }
>>Boolean
function Boolean() { [native code] }
Run Code Online (Sandbox Code Playgroud)

这些原始值类型的目的是提供诸如toStringvalueOf它们各自的原始值类型的方法:

>>var n = 1;
>>n.toString();
"1" 
Run Code Online (Sandbox Code Playgroud)

是相同的

>>var n = 1;
>>Number.prototype.toString.call(n);
"1"
Run Code Online (Sandbox Code Playgroud)

布尔值和字符串也是这样工作的:

>>var b = true;
>>b.toString(); 
"true"
>>Boolean.prototype.toString.call(b);
"true"
Run Code Online (Sandbox Code Playgroud)

当您尝试混合类型时,您可以看到原始值对象正在使用其伴随对象的方法:

>>Boolean.prototype.toString.call(n); 
TypeError: Boolean.prototype.toString is not generic
>>Number.prototype.toString.call(b)
TypeError: Number.prototype.toString is not generic
Run Code Online (Sandbox Code Playgroud)

有趣的是,对于布尔和字符串文字类型,您可以直接从文字中调用这些方法:

>>true.toString();
"true"
>>Boolean.prototype.toString.call(true)
"true"
>>"moo".toString();
"moo"
>>String.prototype.toString.call("moo")
"moo"
Run Code Online (Sandbox Code Playgroud)

原始值为null和undefined,因为它们没有附带的Null和Undefined对象不能执行以下操作:

>>Null
ReferenceError: Null is not defined
>>null.toString()
TypeError: Cannot call method 'toString' of null
Run Code Online (Sandbox Code Playgroud)

原始值类型编号的行为类似于两者的混合.toString如果直接使用Number的原型对象的方法,则可以调用文字:

>>Number.prototype.toString.call(1);
"1"
Run Code Online (Sandbox Code Playgroud)

但是你不能像字符串和布尔值一样从文字本身访问该方法:

>>1.toString()
SyntaxError: Unexpected token ILLEGAL
Run Code Online (Sandbox Code Playgroud)

为什么数字文字的行为与布尔和字符串不同,即使有一个Number对象?

Nic*_*ver 33

可以以相同的方式访问它,这是一个不同的解析问题,要做到这一点,使用稍微不同的语法:

(1).toString()
Run Code Online (Sandbox Code Playgroud)

数字可以有小数,因此当您解析代码时,使用括号有效时,以小数结尾的语法有点模棱两可.当你看到它也有效时,它会更清楚一些:

(1.).toString()
Run Code Online (Sandbox Code Playgroud)

然而,只是1.toString()它试图解析为带小数的数字,并且它失败了.

  • 1..toFixed(2),1.0.toFixed(2)work parens. (7认同)
  • 没有考虑用()试试。希望我可以将两个答案标记为答案。所以基本上文字有这个属性,但你只需要处理额外的十进制语法。谢谢! (2认同)

awa*_*ken 5

我想你会在另一个Stack Overflow问题的答案中找到你问题的答案.总结西奥的答案:

[解析]解析器期望一个数字后跟一个点作为浮点字面值.[...] [Y]你只需要添加另一个点来使它工作[.]