[英]Number with leading zero in JavaScript
嘗試這個:
var num = 040; console.log(num); // 32
從什么時候開始 40 = 32?
使用前導零,該數字被解釋為八進制和4 * 8 = 32
。
由於前導0
,它被視為八進制(以 8 為底),就像前導0x
將使其變為十六進制(以 16 為底)一樣。 這有着悠久而痛苦的歷史,不再是現代 JavaScript 中八進制數的書寫方式。 在使用嚴格模式的現代 JavaScript 中,“舊”八進制格式是語法錯誤; 八進制數以0o
前綴書寫。
早期(在 Netscape 的初始語言以及第一和第二個 ECMAScript 規范中),數字文字上的前導0
正式表示八進制(以 8 為基數),就像前導0x
表示十六進制(以 16 為基數)一樣:
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
例如, 10
、 012
和0xA
都是十進制數十的寫法。 這與語法類似於 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) 引入了BinaryIntegerLiteral和OctalIntegerLiteral ,所以現在我們有了更多連貫的文字:
0b
或0B
。0o
或0O
。0x
或0X
。舊的OctalIntegerLiteral擴展已重命名為LegacyOctalIntegerLiteral ,在非嚴格模式下仍然允許。
結論
因此,如果要解析以 8 為底的數字,請使用0o
或0O
前綴(舊瀏覽器不支持),或使用parseInt
。
如果您想確保您的數字將以 10 為底進行解析,請刪除前導零,或使用parseInt
。
例子
010
8
(取決於實現)。0o10
, 0O10
8
。parseInt('010', 8)
8
。parseInt('010', 10)
10
。因為0
前綴表示八進制數(以 8 為基數)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.