在JS中调用数字文字的函数有哪些规则?

mwc*_*wcz 5 javascript

自从我开始使用JS以来,我认为在数字文字上调用函数的唯一方法是通过用parens包装它来将它放在表达式位置,如下所示:

1.toString();
// SyntaxError: identifier starts immediately after numeric literal

(1).toString();
// "1"
Run Code Online (Sandbox Code Playgroud)

今天,我想到尝试这个:

0.1.toString();
// "0.1"
Run Code Online (Sandbox Code Playgroud)

为什么这样做?指向官方规范的指针会很棒.

编辑歧义是我的第一个想法,但随后决定1.toString()两者都没有歧义.这比我初想的要深,但我仍然认为我是对的.原因如下:

属性名称可以以数字开头

var obj = { "1" : 1, "2" : 2 };
Run Code Online (Sandbox Code Playgroud)

以数字开头的属性名称只能用方括号引用

obj.1;
// SyntaxError: Unexpected token ILLEGAL
obj['1'];
// 1
Run Code Online (Sandbox Code Playgroud)

也:

1['toString']();
// '1'
Run Code Online (Sandbox Code Playgroud)

因此,1.任何非数字后跟始终是方法调用或属性访问,永远不是十进制数.同样,1.后跟任何数字将始终是十进制数字,从不进行方法调用或属性访问.

Poi*_*nty 5

一旦它看到的第一个.中0.1,那么,随后的. 不能是数字的一部分.

这都是关于歧义的.

编辑 - 规范第7.8.3节明确坚持这一点:

紧跟NumericLiteral后面的源字符不能是IdentifierStart或DecimalDigit.

我不知道到底是什么的是试图阻止,但JavaScript的词法分析器是相当粗糙的,主要是由于正则表达式字面语法和需要一个奇怪的语法分析器,词法的黑客攻击,面对这一切.