網站搜尋

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);