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也就是說,如果 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ì)。
可以看出來,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編程技巧