2008年4月22日 星期二

JavaScript 上的 parseInt()

  這兩天寫程式的時候碰到了這個問題,讓我很疑惑,做了一些測試,看了一下手冊才發現了原因。
<script text="javascript/text">
var str = "08"; var num = parseInt(str);
alert(num);
</script>

  像這樣短短的程式碼,執行後的結果照理說應該要顯示 8,但是顯示的竟然是 0,而且如果把 str 的值換成 01~07 都沒有問題,就只有 08 和 09 的值透過 parseInt() 的轉換結果會出現錯誤。

  看了一下手冊上的 parseInt() 描述之後才發現這實在是個很基本的問題,找個剛開始學著寫程式的人大概都還比我容易發現問題的所在。

  parseInt() 的 prototype 長得是這樣的:parseInt(string, radix),第一個參數string 是要被轉換成數字的字串;第二個參數 radix 則是轉換的基底,這是一個選擇性的參數,如果不加上就會以預設的 10 進位制做轉換。手冊中的附註提到,如果被轉換的字串以 0x 開頭,會被當作是 16 進位的數字;如果是以 0 開頭,則會被當作是 8 進位的數字,也就是因為 8 進位的數字中並沒有 8 和 9 兩個數字,所以轉換的結果才會錯誤。

  雖然我看了手冊之後找到了解法,也就是以 parseInt(num, 10) 做轉換,這樣一來,08 和 09 就不會被誤解成八進位的數字。另外,我在網頁上看到了這句話:"If the string begins with "0", the radix is 8 (octal). This feature is deprecated" 但是我用Firefox 2.0.0.14 和 IE6 測試的結果都是一樣的,看來它們並沒有在實作 JavaScript 時把這項 feature 給拿掉。


沒有留言: