簡體   English   中英

JavaScript 中帶前導零的數字

[英]Number with leading zero in JavaScript

嘗試這個:

 var num = 040; console.log(num); // 32

從什么時候開始 40 = 32?

使用前導零,該數字被解釋為八進制和4 * 8 = 32

TL;博士

由於前導0 ,它被視為八進制(以 8 為底),就像前導0x將使其變為十六進制(以 16 為底)一樣。 這有着悠久而痛苦的歷史,不再是現代 JavaScript 中八進制數的書寫方式。 在使用嚴格模式的現代 JavaScript 中,“舊”八進制格式是語法錯誤; 八進制數以0o前綴書寫。

歷史

早期(在 Netscape 的初始語言以及第一和第二個 ECMAScript 規范中),數字文字上的前導0正式表示八進制(以 8 為基數),就像前導0x表示十六進制(以 16 為基數)一樣:

OctalIntegerLiteral ::
    0 OctalDigit
    OctalIntegerLiteral OctalDigit

例如, 100120xA都是十進制數十的寫法。 這與語法類似於 JavaScript (C, C++, Java, ...) 的其他一些語言保持一致,但它非常令人困惑。

從 ECMAScript 3 開始,這種形式的八進制文字被降級為可選擴展,並且十進制 integer 文字被更改,因此它們不能有前導零(除非實現包括擴展):

DecimalIntegerLiteral ::
    0
    NonZeroDigit DecimalDigits(opt)

但是ECMAScript 5禁止在嚴格模式下這樣做:

在處理嚴格模式代碼(參見 10.1.1)時,符合規范的實現不得將NumericLiteral的語法擴展為包括B.1.1中描述的OctalIntegerLiteral

ECMAScript 6 (ECMAScript 2015) 引入了BinaryIntegerLiteralOctalIntegerLiteral ,所以現在我們有了更多連貫的文字:

  • BinaryIntegerLiteral ,前綴為0b0B
  • OctalIntegerLiteral ,前綴為0o0O
  • HexIntegerLiteral ,前綴為0x0X

舊的OctalIntegerLiteral擴展已重命名為LegacyOctalIntegerLiteral ,在非嚴格模式下仍然允許。

結論

因此,如果要解析以 8 為底的數字,請使用0o0O前綴(舊瀏覽器不支持),或使用parseInt

如果您想確保您的數字將以 10 為底進行解析,請刪除前導零,或使用parseInt

例子

  • 010
    • 在嚴格模式下(需要 ECMAScript 5),這是一個語法錯誤。
    • 在非嚴格模式下,可能是語法錯誤或返回8 (取決於實現)。
  • 0o10 , 0O10
    • 在 ECMAScript 6 之前,它們是語法錯誤。
    • 在 ECMAScript 6 中,它們返回8
  • parseInt('010', 8)
    • 它返回8
  • parseInt('010', 10)
    • 它返回10

如果您有興趣,可以在此處找到當前的生活規范,並此處找到歷史版本。

因為0前綴表示八進制數(以 8 為基數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM