[javascript] 019가 JavaScript 구문 오류가 아닌 이유는 무엇입니까? 또는 019> 020 인 이유
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
OctalIntegerLiteral
또한 허용하지 않습니다 019
( 9
8 진수가 아니므로) :
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
OctalDigit :: one of
0 1 2 3 4 5 6 7
그래서 제가 사양에서 본 019
것은 실제로 거부되어야합니다. 왜 그것이 십진 정수로 해석되는지 모르겠습니다.
여기에 어떤 종류의 호환성 규칙이 있다고 생각하지만 공식적인 정의를 찾지 못했습니다. 누구든지 이것으로 나를 도울 수 있습니까?
(이것이 필요한 이유 : JavaCC를 사용하여 Java 용 JavaScript / ECMAScript 파서를 개발 중이며 사양 및 그 편차에 특별한주의를 기울여야합니다.)
답변
내가 찾은 바에 따르면 JavaScript의 일부 구현은 해당 지점의 사양을 따르지 않는 것 같습니다.
로부터 MDN 사이트 :
십진 리터럴은 영 (0)과 다른 십진수로 시작할 수 있지만 선행 0 뒤의 다음 숫자가 8보다 작 으면 숫자가 8 진수로 구문 분석됩니다. 이것은 JavaScript에서 발생하지 않습니다 . bug 957513을 참조하십시오 . parseInt ()에 대한 페이지도 참조하십시오.
이것은 019 == 19
선행 0 뒤의 다음 숫자가 1이고 따라서 전체 숫자를 8 진수로 구문 분석해야하는 이유를 설명하지 않습니다 . 그러나 참조 된 버그는 귀하의 사례와 관련이있는 것 같습니다. 설명은 다음과 같습니다.
다음 JavaScript 프로그램은 오류를 발생시켜야합니다.
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
그래서 01
A는 LegacyOctalLikeDecimalIntegerLiteral
(3). 그러면 019
A는 NonOctalDecimalIntegerLiteral
차례로 (2) DecimalIntegerLiteral
(1).