伙计们,我 DO 意识到Why does 10..toString() work, but 10.toString() does not?问题的存在,但问题是它没有提供正式的解释。
规范的解释。该特定位置的字符是小数。这由ECMAScript的数字文字语法定义。
不参考标准是不够可信的
我下意识地明白了
42..toString()
解析器将视为42.
个数字,然后进行.toString()
调用。
我无法理解的是为什么翻译无法实现
42.toString()
是42
,后跟方法调用。
它只是现代JS解释器的缺点还是由ES5.1明确说明?
从ES5.1开始,Numeric Literal被定义为(仅是定义的重要部分):
NumericLiteral ::
DecimalLiteral
HexIntegerLiteral
DecimalLiteral ::
DecimalIntegerLiteral . DecimalDigits(opt) ExponentPart(opt)
. DecimalDigits ExponentPart(opt)
DecimalIntegerLiteral ExponentPart(opt)
最后一条规则是我希望解析器选择的规则。
UPD :澄清一下,这个问题希望作为ES规范的答案参考,明确说明解释器必须像它一样行事
答案 0 :(得分:8)
我相信你遗失的那篇文章是this quote from section 7:
从左到右扫描源文本,重复使用尽可能长的字符序列作为下一个输入元素。
注意“最长的字符序列”;自“42”是一个有效的标记(它是一种输入元素),它必须使用而不是“42”然后“。”。
答案 1 :(得分:0)
由于标准中引用的.
的定义,解析过程的词法阶段正好消耗NumericLiteral
。该定义指定数字文字(此处为DecimalLiteral
)包含.
(如果存在) - 请参阅DecimalLiteral ::
下的第一行。
由于数字文字标记使用42.
,因此下一个标记为toString
,缺少前导期,因此无法识别为方法调用。