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