可能重複:
Workarounds for JavaScript parseInt octal bug在JavaScript:爲什麼parseInt(「08」)評估爲零,但parseInt(08)評估罰款?
我認爲它是與八進制的解析,因爲它只是發生在8或9還有人認爲這是一個Chrome漏洞,但它也在Firefox中複製。
這是故意的行爲嗎?如果是這樣,爲什麼?
可能重複:
Workarounds for JavaScript parseInt octal bug在JavaScript:爲什麼parseInt(「08」)評估爲零,但parseInt(08)評估罰款?
我認爲它是與八進制的解析,因爲它只是發生在8或9還有人認爲這是一個Chrome漏洞,但它也在Firefox中複製。
這是故意的行爲嗎?如果是這樣,爲什麼?
這裏的解決方案很簡單。切勿撥打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()
時,它無關緊要,因爲該值已經是一個數字,因此它不會嘗試對其進行更改。
「這是故意的行爲嗎?
是的。
「如果是這樣,爲什麼?」
領先0
是用於表示如在說明書中定義一個八進制數的表示法。符號8
和9
不以八進制編號存在,因此parseInt
使用它找到的第一個有效號碼,即0
。
如果你這樣做......
parseInt('[email protected]$_.f(--_!2*')
...結果會是...
123
...因爲一個有效的數字是在字符串的開頭找到。任何無效的東西都會被丟棄。
我知道他們不存在八進制,但爲什麼一個字符串會解析爲八進制parseInt(),當一個數字不是? – 2012-03-15 16:37:41
字面數字08只是8 – 2012-03-15 16:39:14
我的猜測是,parseInt函數需要一個字符串參數,如果你傳遞08(這是類型號),它首先將它轉換爲字符串,不領先的零。嘗試在控制檯中輸入 - (08 +''),你會看到你得到「8」而不是「08」,這意味着它運行parseInt(「8」) - 這是一個十進制轉換。 – yoavmatchulsky 2012-03-15 16:43:38