自从我开始使用JS以来,我认为在数字文字上调用函数的唯一方法是通过用parens包装它来将它放在表达式位置,如下所示:
1.toString();
// SyntaxError: identifier starts immediately after numeric literal
(1).toString();
// "1"
今天,我想到了这个:
0.1.toString();
// "0.1"
为什么这样做?指向官方规范的指针会很棒。
编辑歧义是我的第一个想法,但随后决定1.toString()
中也没有歧义。这比我初想的要深,但我仍然认为我是对的。原因如下:
属性名称可以以数字
开头var obj = { "1" : 1, "2" : 2 };
以数字开头的属性名称只能用方括号引用
obj.1;
// SyntaxError: Unexpected token ILLEGAL
obj['1'];
// 1
此外:
1['toString']();
// '1'
因此,1.
后跟任何非数字将始终是方法调用或属性访问,绝不是十进制数。同样地,1.
后跟任何数字将始终是十进制数,而不是方法调用或属性访问。
答案 0 :(得分:5)
一旦看到.
中的第一个0.1
,后续的.
就不能成为该号码的一部分。
这完全是歧义。
编辑 - 规范第7.8.3节明确坚持这一点:
紧跟NumericLiteral之后的源字符不能是 IdentifierStart 或 DecimalDigit 。
我不确定究竟是什么阻止,但JavaScript词法分析器非常粗糙,主要归功于正则表达式文字语法以及需要一个奇怪的解析器 - 词法分析器黑客来处理它。