有個(gè)空間

          有個(gè)標(biāo)題

          JavaScript 的 parseInt('08')


          背景:
                  在javascript中將字符串轉(zhuǎn)換成整數(shù)時(shí),用到一個(gè)函數(shù)parseInt。這個(gè)函數(shù)完整的表達(dá)式是:
          parseInt(string, radix)

          一般情況下,都會(huì)省掉第二個(gè)參數(shù)radix。當(dāng)遇到轉(zhuǎn)換“0”開頭的字符串的時(shí)候,問題就來了。
              parseInt("01") =1
                        ~
              parseInt("07") =7


              parseInt("08") =0
              parseInt("09") =0

              parseInt("10") =10

          這是為什么呢?
          函數(shù)的第一個(gè)參數(shù) string 當(dāng)然是要轉(zhuǎn)換為數(shù)字的字串,第二個(gè)參數(shù) radix 則是要用二進(jìn)位、還是八進(jìn)位或十六進(jìn)位,又或是最熟悉的十進(jìn)位來解譯這個(gè)字串呢?

          也就是說,如果 parseInt('FF',
          16),代表以 16 進(jìn)位方式來解析FF這個(gè)字串,當(dāng)然得到的結(jié)果就是 255 了,同理,parseInt('FF',10) 以 10 進(jìn)位來解析FF這個(gè)字串,根本就不是數(shù)字,所以得到的結(jié)果會(huì)是 NaN。

          但大多數(shù)人不會(huì)特別指定第二個(gè)參數(shù),這時(shí) JavaScript 就自動(dòng)判斷第一個(gè)傳遞的參數(shù)是否為某種數(shù)字型式。

          在 JavaScript 眼中,以 0x 開頭的字串,都視為十六進(jìn)位字串,如果單單是0開頭,第二個(gè)字母不是 x,則視為八進(jìn)位或二進(jìn)位字串,十六進(jìn)位使用的字母計(jì)有 
          0-9,A-F,而八進(jìn)位使用的字母則為 0-7,所以,當(dāng)發(fā)生parseInt('08') 又未指定以何種數(shù)值型態(tài)解析時(shí),JavaScript 以 0 為起頭,接下來的字母又不是 x,那一定是八進(jìn)位了,但是,八進(jìn)位裡,怎麼可能有 8 和 9 這兩個(gè)字母呢?所以,一定是不合法的字串,於是就傳回 0

          同理,parseInt('
          010') 回傳的值,也不是 10,而是 8,因?yàn)?nbsp;parseInt() 認(rèn)為 0 開頭,接下來的字母不是 x,而是 1,就以二進(jìn)位來解析 010 這個(gè)字串,所以一切問題都在於以 0 開頭,所造成的誤會(huì)。
          注:以上文字來源于http://www.cnblogs.com/zxp_9527/archive/2009/02/27/1399658.html

          可以看出來,root cause就是字符串中以“0”開頭了。萬惡零開頭。

          解決辦法
                  
          不能偷懶,該轉(zhuǎn)換成什么進(jìn)制就在第二個(gè)參數(shù)標(biāo)明,如parseInt("08",10) = 8 這樣就不會(huì)錯(cuò)了。





          posted on 2010-08-13 08:43 游雯 閱讀(675) 評論(0)  編輯  收藏 所屬分類: Java編程技巧

          主站蜘蛛池模板: 罗江县| 高台县| 宣恩县| 耿马| 抚顺市| 岫岩| 平舆县| 镇坪县| 垣曲县| 巴东县| 邵阳市| 蕉岭县| 上林县| 襄汾县| 北票市| 洞头县| 彭水| 汉阴县| 社会| 兴仁县| 北海市| 汾阳市| 墨玉县| 眉山市| 原阳县| 莱西市| 奇台县| 大安市| 旬邑县| 如皋市| 彝良县| 太湖县| 阿坝县| 开封县| 班戈县| 包头市| 南通市| 邳州市| 和顺县| 桐城市| 苏尼特左旗|