SORU
24 Ocak 2015, CUMARTESİ


Neden 019 JavaScript sözdizimi bir hata değil mi? Ya da neden 019 > 020.

Ben JavaScript konsolunda 4 ** (Chrome ve Firefox test) yazarsanız, cevap true olsun.

Bu 020 019 anlaşılan DecimalLiteral olarak algılanıyor oysa OctalIntegerLiteral eşit 16 () yorumlanan (19 eşittir) kaynaklanmaktadır. 19 16, 019 > 020 daha büyük true.

019 neden bana ne olduğunu ilk etapta DecimalLiteral olarak yorumlanır. Hangi üretim? DecimalIntegerLiteral 019 izin vermiyor:

DecimalIntegerLiteral ::
    0
    NonZeroDigit DecimalDigits_opt

OctalIntegerLiteral 019 9 sekizlik bir rakam değil gibi) izin vermiyor:

OctalIntegerLiteral ::
    0 OctalDigit
    OctalIntegerLiteral OctalDigit

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

, 019 şartnamede aslında reddedilmelidir gördüğüm kadarıyla, bir ondalık tamsayı olarak yorumlanır anlamıyorum.

Yerde uyumluluk kuralı diye bir şey var sanırım ama resmi bir tanım bulmak için başarısız oldum. Lütfen herkes bu konuda bana yardımcı olabilir mi?

(Neden bu gerekir: JavaScript/ECMAScript parser for Java with JavaCC geliştiriyorum ve şartname ve sapmalar bunların.) için özel bir dikkat etmeniz gerekiyor

CEVAP
24 Ocak 2015, CUMARTESİ


Bulabildiğim kadarıyla, JavaScript bazı uygulamaları sadece bu konuda spec izleyin yok gibi görünüyor.

MDN site:

Ondalık rakamları sıfır (0) ile başlar unutmayın ardından Eğer baştaki 0 sonraki basamak İse başka bir ondalık basamak, ama 8, Bir sayıyı sekizli olarak ayrıştırılmış olur sayısından küçük. Bu olmaz JavaScript, bug 957513 bakın at. Ayrıca bkz: sayfa hakkında () parseınt.

Bu hala 019 == 19, baştaki 0 sonra bir sonraki basamak verilen 1 ve bütün numarası bu nedenle sekizli olarak ayrıştırılması gerektiğini açıklamıyor. Ama başvurulan böcek davasıyla ilgili görünüyor. Onun hakkında diyor ki:

Aşağıdaki JavaScript program bir hata atmak gerekir:

08

, DecimalIntegerLiteral spec başına asla 0 doğrudan olabilir gibi başka bir ondalık basamak ile izlenen, ancak Chrome/Opera, PrestOpera, ve Firefox desteği.

Hata WONTFIX olarak kapatıldı

Ancak 019 geçerli bir ondalık edebi değeri ile bir sonraki sürümün taslağa göre 19, eşit olacaktır:

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

(İlgili kuralları işaretledim)

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

Yani 01 LegacyOctalLikeDecimalIntegerLiteral (3) . Sonra 019 sıraylaDecimalIntegerLiteral (1)Bir olan NonOctalDecimalIntegerLiteral (2) .

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • arnejann

    arnejann

    3 Kasım 2007
  • Matt Stokes

    Matt Stokes

    22 Ocak 2008
  • TheFlashCentre

    TheFlashCent

    22 Mayıs 2008