建議4:注意JavaScript資料類型的特殊性(4)
4.避免誤用parseInt
parseInt是一個将字元串轉換為整數的函數,與parseFloat(将字元串轉換為浮點數)對應,這兩種函數是JavaScript提供的兩種靜态函數,用于把非數字的原始值轉換為數字。
在開始轉換時,parseInt會先檢視位置0處的字元,如果該位置不是有效數字,則将傳回NaN,不再深入分析。如果位置0處的字元是數字,則将檢視位置1處的字元,并重複前面的測試,依此類推,直到發現非數字字元為止,此時parseInt()函數将把前面分析合法的數字字元轉換為數值并傳回。
parseInt("123abc"); // 123
parseInt("1.73"); // 1
parseInt(".123"); // NaN
浮點數中的點号對于parseInt來說屬于非法字元,是以它不會被轉換并傳回,這樣,在使用parseInt時,就存在潛在的誤用風險。例如,我們并不希望parseInt("16")與parseInt("16 tons")産生相同的結果。如果該函數能夠提醒我們出現額外文本就好了,但它不會那麼做。
對于以0為開頭的數字字元串,parseInt()函數會把它作為八進制數字處理,先把它轉換為數值,然後再轉換為十進制的數字傳回。對于以0x開頭的數字字元串, parseInt()函數則會把它作為十六進制數字處理,先把它轉換為數值,然後再轉換為十進制的數字傳回。例如:
var d = "010"; //八進制
var e = "0x10"; //十六進制
parseInt(d); //8
parseInt(e); //16
如果字元串的第一個字元是0,那麼該字元串将基于八進制而不是十進制來求值。在八進制中,8和9不是數字,是以parseInt("08")和parseInt("09")的結果為0,這個錯誤導緻了在程式解析日期和時間時經常會出現問題。幸運的是,parseInt可以接受一個基數作為參數,這樣parseInt("08",10)結果為8,parseInt("09",10)結果為9。是以,建議讀者在使用parseInt時,一定要提供這個基數參數。
通過在parseInt中提供基數參數,可以把二進制、八進制、十六進制等不同進制的數字字元串轉換為整數。例如,下面把十六進制數字字元串"123abc"轉換為十進制整數。
parseInt("123abc",16); // 1194684
再如,把二進制、八進制和十進制數字字元串轉換為整數:
parseInt("10",2); //把二進制數字10轉換為十進制整數為2
parseInt("10",8); //把八進制數字10轉換為十進制整數為8
parseInt("10" ,10); //把十進制數字10轉換為十進制整數為10