为什么42.toString()在JS中失败?

时间:2014-06-25 00:18:55

标签: javascript ecmascript-5

声明

伙计们,我 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规范的答案参考,明确说明解释器必须像它一样行事

2 个答案:

答案 0 :(得分:8)

我相信你遗失的那篇文章是this quote from section 7

  

从左到右扫描源文本,重复使用尽可能长的字符序列作为下一个输入元素。

注意“最长的字符序列”;自“42”是一个有效的标记(它是一种输入元素),它必须使用而不是“42”然后“。”。

答案 1 :(得分:0)

由于标准中引用的.的定义,解析过程的词法阶段正好消耗NumericLiteral。该定义指定数字文字(此处为DecimalLiteral)包含.(如果存在) - 请参阅DecimalLiteral ::下的第一行。

由于数字文字标记使用42.,因此下一个标记为toString,缺少前导期,因此无法识别为方法调用。