lex*_*ore 78 javascript grammar javacc language-lawyer ecmascript-5
如果我输入019 > 020
JavaScript控制台(在Chrome和Firefox中测试),我会得到答案true
.
这是因为020
被解释为OctalIntegerLiteral
(等于16
),而019
显然被解释为DecimalLiteral
(和等于19
).由于19
是大于16
,019 > 020
是true
.
令我困惑的是为什么019
被解释为DecimalLiteral
第一名.它是哪种产品?DecimalIntegerLiteral
不允许019
:
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits_opt
Run Code Online (Sandbox Code Playgroud)
OctalIntegerLiteral
也不允许019
(因为9
不是八进制数字):
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
OctalDigit :: one of
0 1 2 3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)
因此,从我在规范中看到的,019
实际应该被拒绝,我不明白为什么它被解释为十进制整数.
我想这里有一些兼容性规则,但我找不到正式的定义.可以请任何人帮我这个吗?
(为什么我需要这个:我正在使用JavaCC为Java开发一个JavaScript/ECMAScript解析器,并且必须特别注意规范 - 以及它的偏差.)
abl*_*abl 52
从我能找到的,似乎JavaScript的某些实现不遵循该点的规范.
来自MDN网站:
请注意,十进制文字可以以零(0)开头,后跟另一个十进制数字,但如果前导0之后的下一个数字小于8,则该数字将被解析为八进制数.这不会引入 JavaScript,请参阅错误957513.另请参阅有关parseInt()的页面.
这仍然没有解释为什么019 == 19
,假设前导0之后的下一个数字是1,因此整数应该被解析为八进制.但引用的bug似乎与您的案例有关.它的描述说:
以下JavaScript程序应该抛出错误:
Run Code Online (Sandbox Code Playgroud)08
根据规范,虽然Chrome/Opera,PrestOpera和Firefox都支持它,但
DecimalIntegerLiteral
永远不能0
直接跟随另一个十进制数字.
该错误以WONTFIX关闭
但是,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
Run Code Online (Sandbox Code Playgroud)
所以,01
是LegacyOctalLikeDecimalIntegerLiteral
(3).然后019
是NonOctalDecimalIntegerLiteral
(2)又是DecimalIntegerLiteral
(1).
归档时间: |
|
查看次数: |
2544 次 |
最近记录: |