为什么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)。