JavaScript parseInt()

admin發表於2018-09-21

parseInt方法可以將字串轉換為整數。

轉化需要遵循指定的規則,後面會通過程式碼例項詳細介紹。

首先看一段程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
console.log(parseInt("8"));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/21/092150ipxqxly11rxigf29.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

上述程式碼利用parseInt方法將字元"8"轉換為數值8。

看起來此方法確實是非常簡單,很多初學者對它的瞭解可能也僅限於此。

但是如果深究起來,此方法的內容並不少,甚至對初學者造成一定的困擾。

程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let num=0O50;
console.log(parseInt(num,8));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/21/094908w8i3g8quy3x4d42r.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

八進位制數字0O50經過parseInt方法轉換以後得到的結果是32。

這可能會迷惑一部分朋友,後面會對此專門分析。

語法結構:

[JavaScript] 純文字檢視 複製程式碼
parseInt(str, radix)

引數解析:

(1).str:必需,要進行轉換的字串,如果不是字串會隱式將其轉換為字串。

(2).radix:可選,規定以何種進位制來解析str引數中的數字,值介於2-36之間,如果省略可能是十進位制也可能是其他進位制,後面會通過具體的程式碼例項詳細說明,建議始終填寫此引數。

特別說明:

(1).返回值是十進位制數字。

(2).ES2015之前,此方法屬於Global物件,但不能顯示使用Global物件呼叫(Global.parseInt())。

(2).ES2015將此方法歸屬於Number物件,靜態方法,功能與ES2015之前完全相同。

更多Global物件內容參閱JavaScript Global物件一章節。

瀏覽器相容:

(1).IE瀏覽器支援此方法。

(2).Edge瀏覽器支援此方法。

(3).谷歌瀏覽器支援此方法。

(4).火狐瀏覽器支援此方法。

(5).opera瀏覽器支援此方法。

(6).safria瀏覽器支援此方法。

程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let str="17";
console.log(parseInt(str));

程式碼執行截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/21/095307ub5n98rggw958tb8.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

省略第第二個引數,這時候它預設以十進位制解析前面的數字。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let num=17;
console.log(parseInt(num));

程式碼執行截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/21/095341rc82zczqs6vvzclh.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

如果引數是數字,那麼首先將其轉換為字串,然後再預設以十進位制解析前面的數字。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let str=" 17";
console.log(parseInt(str));

程式碼執行截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/21/095437ksiaigs71kssaiiy.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

字串前面的空格是允許的,parseInt方法會將其忽略不計。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let str="17ab88";
console.log(parseInt(str));

程式碼執行截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/21/095514g30chkhu0ucvyoxh.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

如果字串並非全都是數字,那麼將從左到右擷取直到非radix進位制內字元位置。

比如上面的字串中,17都是十進位制範疇內的數字,字元a不是,所以最終結果為17。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let str="0xF";
console.log(parseInt(str));

程式碼執行截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/21/095554mq011e0t89tfjb3f.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

如果字串是以0x起始,並且沒有規定第二個引數,那麼以十六進位制解析。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let str="1011";
console.log(parseInt(str,2));

程式碼執行截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/21/095637x8vi545c4tjhdsnu.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

規定以2進位制解析前面的數字字串。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let str="1081";
console.log(parseInt(str,2));

程式碼執行截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/21/095715nu8fdqzy6hy88gzv.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

從起始位置開始擷取,一直到8,(不包括),因為8不在二進位制範疇之內。

下面回到文章開頭的問題,程式碼如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let num=0O50;
console.log(parseInt(num,8));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/21/095755znzejana8v2y88w3.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

分析如下:

(1).首先要將第一個引數轉換為字串。

(2).轉換成字串隱式呼叫toString方法,這裡要注意了,當前數字是八進位制,通過toString會將其轉換為十進位制形式,轉換結果為40,那麼可以認為程式碼變為parseInt("40", 8)。

(3).由於第二個引數是8,所以將40是八進位制數字解析,轉換結果就是32。

省略第二個引數時,對以0為起始的數字處理:

(1).ES5之前,如果省略第二個引數,那麼以0為起始的數字字串被預設為是八進位制數字。

(2).ES5規定,如果省略第二個引數,以0為起始的數字字串不再被認為是八進位制數字

[JavaScript] 純文字檢視 複製程式碼
parseInt("027");

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/21/095835dp6vc6dh7g448zl8.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可以看到數字字串以0起始,但是並沒有被當做八進位制解析。

[JavaScript] 純文字檢視 複製程式碼
parseInt(027);

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/21/095909kzzu663nmzm8tz45.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

為什麼上面的程式碼列印的是23呢。

這是因為雖然以0起始數字字串作為parseInt方法引數的時候,不被認作是八進位制。

但是在非parseInt方法引數的情況下,以0起始的數字,當前(2018-9-21)依然預設被當做八進位制數字,027首先要被轉換為字串"23",這時候以十進位制解析,自然列印23。

相關文章