5

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

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.后面的任何数字始终是十进制数,绝不是方法调用或属性访问。

4

1 回答 1

5

一旦在 中看到第一个.0.1则后续. 不能是数字的一部分。

这都是关于模棱两可的。

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

紧跟 NumericLiteral 的源字符不能是IdentifierStartDecimalDigit

I'm not sure exactly what that's trying to prevent, but the JavaScript lexer is pretty gnarly, mostly thanks to the regex literal grammar and the need for a weird parser-lexer hack to deal with that.

于 2012-05-02T16:21:00.583 回答