2012-03-15 110 views
3

可能重複:
Workarounds for JavaScript parseInt octal bug在JavaScript:爲什麼parseInt(「08」)評估爲零,但parseInt(08)評估罰款?

我認爲它是與八進制的解析,因爲它只是發生在8或9還有人認爲這是一個Chrome漏洞,但它也在Firefox中複製。

這是故意的行爲嗎?如果是這樣,爲什麼?

+0

我的猜測是,parseInt函數需要一個字符串參數,如果你傳遞08(這是類型號),它首先將它轉換爲字符串,不領先的零。嘗試在控制檯中輸入 - (08 +''),你會看到你得到「8」而不是「08」,這意味着它運行parseInt(「8」) - 這是一個十進制轉換。 – yoavmatchulsky 2012-03-15 16:43:38

回答

12

這裏的解決方案很簡單。切勿撥打parseInt()而不指定所需的基數。當您不傳遞第二個參數時,parseInt()會嘗試猜測基數是基於數字格式的。當它猜測時,它經常出錯。

指定這樣的基數,你會得到期望的結果:

parseInt("08", 10) == 8; 

至於什麼樣的規則,它使用了猜測,您可以參考MDN doc page for parseInt()

如果基數是未定義的或0,JavaScript的假定:

  • 如果輸入字符串以 「0x」 或 「0X」 開頭,基數是16 (十六進制)。
  • 如果輸入字符串以「0」開頭,則基數爲8 (八進制)。這個功能是非標準的,有些實現 故意不支持它(而是使用基數10)。 對於此 原因總是指定使用parseInt時的基數。
  • 如果輸入字符串 以任何其他值開頭,則基數爲10(十進制)。如果第一個 字符無法轉換爲數字,parseInt將返回NaN。

因此,根據這些規則,parseInt()會猜測"08"是八進制,但隨後遇到未在八進制允許所以它返回0一個數字。

當您將一個數字傳遞給parseInt()時,它無關緊要,因爲該值已經是一個數字,因此它不會嘗試對其進行更改。

5

「這是故意的行爲嗎?

是的。

「如果是這樣,爲什麼?」

領先0是用於表示如在說明書中定義一個八進制數的表示法。符號89不以八進制編號存在,因此parseInt使用它找到的第一個有效號碼,即0

如果你這樣做......

parseInt('[email protected]$_.f(--_!2*') 

...結果會是...

123 

...因爲一個有效的數字是在字符串的開頭找到。任何無效的東西都會被丟棄。

+0

我知道他們不存在八進制,但爲什麼一個字符串會解析爲八進制parseInt(),當一個數字不是? – 2012-03-15 16:37:41

+0

字面數字08只是8 – 2012-03-15 16:39:14

0

可以這樣解決這個問題:

parseInt("080".replace(/^[0]+/g,"")); 
+0

我確實使用這種類型的hack {data.replace(/^0 + /,'')}來處理排序問題,但想知道爲什麼它會這樣做。 – 2012-03-15 16:40:55

+3

爲什麼哦,你爲什麼要這樣做,當你可以傳遞給parseInt的基數,它會爲你做正確的事情? – jfriend00 2012-03-15 16:42:52

+0

對,我每天都在學習東西:-) – Alytrem 2012-03-15 16:45:03

相關問題