【问题标题】:Why don't number literals have access to Number methods? [duplicate]为什么数字文字不能访问 Number 方法? [复制]
【发布时间】:2010-10-28 19:07:47
【问题描述】:

如果您查看 ECMAScript 3 规范,您会发现原始值类型 Null 和 Undefined 没有伴随的 Null 和 Undefined 对象。

>> Null
ReferenceError: Null is not defined

其他原始值类型 Number、String 和 Boolean 类型确实具有随附的 Number、String 和 Boolean 对象,您可以从全局范围引用它们。

>>Number
function Number() { [native code] }
>>Boolean
function Boolean() { [native code] }

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

>>var n = 1;
>>n.toString();
"1" 

相同
>>var n = 1;
>>Number.prototype.toString.call(n);
"1"

布尔值和字符串也可以这样工作:

>>var b = true;
>>b.toString(); 
"true"
>>Boolean.prototype.toString.call(b);
"true"

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

>>Boolean.prototype.toString.call(n); 
TypeError: Boolean.prototype.toString is not generic
>>Number.prototype.toString.call(b)
TypeError: Number.prototype.toString is not generic

对于布尔和字符串字面量类型来说足够有趣,您可以直接从字面量中调用这些方法:

>>true.toString();
"true"
>>Boolean.prototype.toString.call(true)
"true"
>>"moo".toString();
"moo"
>>String.prototype.toString.call("moo")
"moo"

原始值 null 和 undefined,因为它们没有伴随的 Null 和 Undefined 对象不能做这些事情:

>>Null
ReferenceError: Null is not defined
>>null.toString()
TypeError: Cannot call method 'toString' of null

原始值类型数字的行为类似于两者的混合。如果直接使用 Number 的原型对象的方法,则可以在字面量上调用 toString

>>Number.prototype.toString.call(1);
"1"

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

>>1.toString()
SyntaxError: Unexpected token ILLEGAL

为什么数字字面量的行为与布尔值和字符串不同,即使有数字对象?

【问题讨论】:

标签: javascript


【解决方案1】:

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

(1).toString()

数字可以有小数,所以以小数结尾的语法在你去解析代码时有点模棱两可,使用括号是有效的。当你看到这也是有效的时,它就更清楚了:

(1.).toString()

然而,只有1.toString() 它试图解析为一个带小数点的数字,但它失败了。

【讨论】:

  • 没有考虑用 () 试试。希望我可以将两个答案标记为答案。所以基本上文字有这个属性,但你只需要处理额外的十进制语法。谢谢!
  • 1..toFixed(2), 1.0.toFixed(2) 无需括号即可工作。
  • @kennebec - 是的,它们也能正常工作,我更想表达的是(anyType).toString() 将是一种可以工作的一致格式,抱歉,如果不完全清楚......没有并不是说没有专门的数字替代品。
【解决方案2】:

我想您会在 this answer 中找到另一个 Stack Overflow 问题的答案。总结Theo的回答:

[T]他的解析器期望后面跟着一个数字 由一个点作为一个浮点数 文字。 [...] [Y]您只需添加另一个点即可使其工作[.]

【讨论】:

  • 哇!我认为它与小数有关,但我认为还有更多。很有趣,看到我很高兴我问了。
【解决方案3】:

Null(大写N)是一个变量名。保留字区分大小写。 null 是对象 null。 typeof null === "object" //true

【讨论】:

  • null.toString() --> Uncaught TypeError: Cannot read property 'toString' of null
猜你喜欢
  • 2016-01-19
  • 2018-07-31
  • 2016-11-25
  • 2017-05-31
  • 1970-01-01
  • 2017-02-02
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多