【问题标题】:What are the rules for invoking functions on number literals in JS? [duplicate]JS中对数字字面量调用函数的规则是什么? [复制]
【发布时间】:2012-05-02 16:19:40
【问题描述】:

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

【问题讨论】:

  • 作为注释,可以使用1..toString(),第一个.表示小数点,第二个表示函数用途。
  • 聪明,感谢 zzzzBov 和 CMS。
  • 嗯,“e”周围有一个 small 歧义——它是指数的开始,还是标识符的第一个字母?考虑1.e10(); - 标记器不喜欢“备份”:-)
  • 我不同意标记这个副本。该问题包含更多上下文,并且选择的答案质量更高(包括指向定义此行为的实际 JavaScript 规范的链接)。

标签: javascript


【解决方案1】:

一旦在0.1 中看到第一个.,那么随后的. 不能成为数字的一部分。

这都是关于模棱两可的。

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

紧跟 NumericLiteral 的源字符不能是 IdentifierStartDecimalDigit

我不确定这究竟是为了防止什么,但 JavaScript 词法分析器非常粗糙,这主要归功于正则表达式文字语法以及需要一个奇怪的解析器-词法分析器来处理它。

【讨论】:

  • 我认为这里没有任何歧义。用推理更新我的问题。我对规范中的那句话感到困惑......0.1.toString() 是有效的,但在我看来就像一个 NumericLiteral 紧跟一个 DecimalDigit。
  • @mwcz 是的,我同意没有明显 歧义,但坚持认为该案例被视为错误可能有一些模糊的理由。该规范没有详细说明。 0.1.toString 不是后跟十进制数字的数字文字:它是后跟 . 字符的数字文字,既不是十进制数字也不是标识符开头。
  • 啊,谢谢。我查看了. 并无法将其与. 区分开来:) 我添加了反对歧义的推理,尽管我猜你已经独立得出了结论。
猜你喜欢
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 2016-11-01
  • 2016-03-15
  • 2016-08-19
相关资源
最近更新 更多