Javascript 使用前導零的 parseInt()
JavaScript 的 parseInt 函數似乎無法完全正常運作。
parseInt("01") returns 1
parseInt("02") returns 2
parseInt("03") returns 3
parseInt("04") returns 4
parseInt("05") returns 5
parseInt("06") returns 6
parseInt("07") returns 7
parseInt("08") returns 0
parseInt("09") returns 0
你無法解釋那個。試試看吧。(jsFiddle)
編輯 自從這個問題被提出和回答後,默認使用八進制的「特性」已被棄用。[1] [2]
答案#1
這是因為如果一個數字以 '0' 開頭,它會被視為八進位(octal)。
你可以通過將基數作為第二個參數來強制指定基數。
parseInt("09", 10) // 9
根據文件,第二個參數是可選的,但它並非總是被假定為 10,正如你從你的例子中可以看到的那樣。
答案#2
對 parseInt 的調用應該總是在第二個參數中指定進位:
parseInt("08", 10);
早期版本的 JavaScript 將以 0 開頭的字串視為八進位(當未指定進位時),而 08 和 09 都不是有效的八進位數字。
來自 Mozilla 文件:
如果基數未定義或為 0,JavaScript 會假設以下情況:
- 如果輸入字串以「0x」或「0X」開頭,則進位為16(十六進位)。
- 如果輸入字串以「0」開頭,基數就是八進位(octal)。這個功能不是標準的,而且一些實作特意不支援它(而是使用基數 10)。因此,使用 parseInt 時務必指定基數。
- 如果輸入字串以其他任何值開始,則基數為 10(十進位)。
如果第一個字元無法轉換成數字,parseInt 會回傳 NaN。
以及來自 ECMAScript 3 標準:
當基數為 0 或 未定義 且字串的數字以 0 開頭且後面沒有跟 x 或 X 時,實作可以自行決定將該數字解讀為八進位或十進位。建議實作在此情況下將數字解讀為十進位。
最新版本的 JavaScript(ECMAScript 5)已放棄此行為,但你仍然應該 明確指定進位數 以兼容舊瀏覽器。
答案#3
有一個基數參數
parseInt(value, base)
其中 base 是基數。
在這種情況下,您正在評估十進位(小數)數字,因此使用
parseInt(value, 10);
