自从我开始使用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.后跟任何数字将始终是十进制数字,从不进行方法调用或属性访问.
一旦它看到的第一个.中0.1,那么,随后的. 不能是数字的一部分.
这都是关于歧义的.
编辑 - 规范第7.8.3节明确坚持这一点:
紧跟NumericLiteral后面的源字符不能是IdentifierStart或DecimalDigit.
我不知道到底是什么的是试图阻止,但JavaScript的词法分析器是相当粗糙的,主要是由于正则表达式字面语法和需要一个奇怪的语法分析器,词法的黑客攻击,面对这一切.