中了 parseInt() 的招... parseInt("0009") 和 parseInt("0009", 10) 竟然有不同的結果!查了之後才發現,原來 ECMAScript 3 和 ECMAScript 5 的表現也不一樣!
latest #23
啊?"0009" 不可能視為 8 進位,那還能變成什麼?
parseInt("0009", 10); // 9
原來 parseInt("09") 就是 0 了,這要怎麼理解...
至於為什麼第一個的輸出會是這樣 beats me
打錯,是 parseInt("013"); // 11
大概知道為什麼了... 基本上在 ES3 中,只要第一個字母是 0 就會以 octal 或 hex 來 parse。但因為 "0009" 不是一個 valid octal number 所以就變成是 0。
聽說在 ES5 裡 octal number parsing 被移除了,所以 parseInt("004") 也會是 0
看到第一個非法字元就停止解析,並傳回目前為止的結果。
parseInt("03a", 10); // 3
經過測試發現16進位也是同樣的情況,在看到第一個非法字元就停止,並傳回目前為止的結果。
Moral of the story: always specify a radix.
第二個參數通常建議要加上去,否則10 進位變成 8 進位,bug 會很難抓!
back to top