Blackbing Playground

Javascript parseInt的奇怪現象

parseInt是強制將字串轉型成整數型態的function,但有時候會發生一些奇怪的事情:
[sourcecode language=”javascript”]
parseInt(“12px”)=12
parseInt(“abc”)=NaN
parseInt(“ “)=NaN
parseInt(“092”)=0
[/sourcecode]
parseInt的規則是遇到非數字字元即停止,因此前三個是可以理解的結果。等等,那最後一個是怎麼回事,”092”應該會被轉成92吧,這個問題一直是我非常疑惑的問題,原來parseInt遇到0開頭的字串,會自動轉為8進位制計算,這實在是令人很不解,還好parseInt可以指定進位制,第二個參數即為進位制。
[sourcecode language=”javascript”]
parseInt(“092”, 10) = 92
[/sourcecode]
如此則可以解決這奇怪的問題,javascript : good parts也建議在這個function都加入第二個進位制的參數,避免不必要的錯誤。

另外也有人會用new Number來解決這個問題,例如:
[sourcecode language=”javascript”]
var str = ‘092’;
var num = new Number(str);
console.log(num); // 92
[/sourcecode]
可以解決parseInt的這個奇怪現象,但在javascript: good parts這本書則指出javascript中這種「typed wrapper」是一種多餘的寫法,例如new Boolean, new Number, new String, new Object, new Array,事實上完全不需要這個功能。而我之前也在new Object() vs {} and new Array() vs [] 效能比較這篇文章 測試過直接用[]、{}來new 陣列和物件的比較,顯然typed wrapper的方式多了一個轉換的步驟,因此有效能上的差異。