为什么019不是JavaScript语法错误? 或者为什么是019> 020

如果我在JavaScript控制台中input019 > 020 (在Chrome和Firefox中都testing过),我的答案是true

这是由于020被解释为OctalIntegerLiteral (等于16 ),而019显然被解释为DecimalLiteral (和等于19 )。 当19大于16019 > 020true

令我感到困惑的是为什么019被解释为DecimalLiteral 。 是哪个生产? DecimalIntegerLiteral不允许019

 DecimalIntegerLiteral :: 0 NonZeroDigit DecimalDigits_opt 

OctalIntegerLiteral也不允许019 (因为9不是八进制数字):

 OctalIntegerLiteral :: 0 OctalDigit OctalIntegerLiteral OctalDigit OctalDigit :: one of 0 1 2 3 4 5 6 7 

所以从我在规范中看到的019实际上应该被拒绝,我不明白为什么它被解释为一个十进制整数。

我想这里有一些兼容性规则,但是我没有find一个正式的定义。 可以请任何人帮助我呢?

(为什么我需要这个:我正在用JavaCC为Java开发一个JavaScript / ECMAScriptparsing器,并且必须特别注意规范及其偏差。)

从我所能find的东西看来,JavaScript的某些实现似乎并没有遵循这个规范。

来自MDN网站:

请注意,十进制文字可以以零(0)开始,后跟另一个十进制数字,但如果前导0之后的下一个数字小于8,则数字将被parsing为八进制数字。 这不会抛出JavaScript,请参阅错误957513 。 另请参阅关于parseInt()的页面。

这仍然不能解释为什么019 == 19 ,因为前面0之后的下一个数字是1,因此整个数字应该被parsing为八进制。 但引用的错误似乎与您的情况有关。 其描述说:

下面的JavaScript程序应该会抛出一个错误:

 08 

根据规范, DecimalIntegerLiteral不能直接跟随另一个十进制数字,尽pipeChrome / Opera,PrestOpera和Firefox都支持它。

该错误作为WONTFIXclosures

但是,根据下一版的草案, 019将是一个有效的十进制文字,其值等于19。

https://people.mozilla.org/~jorendorff/es6-draft.html#sec-additional-syntax-numeric-literals

(我已经标记了相关规则)

 The syntax and semantics of 11.8.3 is extended as follows except that this extension is not allowed for strict mode code: [...] DecimalIntegerLiteral :: 0 NonZeroDigit DecimalDigits_opt NonOctalDecimalIntegerLiteral // (1) NonOctalDecimalIntegerLiteral :: 0 NonOctalDigit LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit // (2) NonOctalDecimalIntegerLiteral DecimalDigit LegacyOctalLikeDecimalIntegerLiteral :: 0 OctalDigit // (3) LegacyOctalLikeDecimalIntegerLiteral OctalDigit 

所以01LegacyOctalLikeDecimalIntegerLiteral (3)。 那么019是一个NonOctalDecimalIntegerLiteral (2),它又是一个DecimalIntegerLiteral (1)。