为什么019不是JavaScript语法错误? 或者为什么是019> 020
如果我在JavaScript控制台中input019 > 020 (在Chrome和Firefox中都testing过),我的答案是true 。
这是由于020被解释为OctalIntegerLiteral (等于16 ),而019显然被解释为DecimalLiteral (和等于19 )。 当19大于16 , 019 > 020为true 。
令我感到困惑的是为什么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
所以01是LegacyOctalLikeDecimalIntegerLiteral (3)。 那么019是一个NonOctalDecimalIntegerLiteral (2),它又是一个DecimalIntegerLiteral (1)。