['1','2','3'].map(parseInt)爲什麼爲[1,NaN,NaN]

首先,先搞明白parseInt函數和map函數的做用!!!數組

一、parseInt

parseInt() 函數可解析一個字符串,並返回一個整數。
bash

語法函數

parseInt(string,radix)

第一個參數:string,要解析的字符串,這沒什麼好說的,必選參數。ui

第二個參數:radix,可選參數,表示你要按幾進制的格式來解析字符串。this

radix傳參
1. 傳參
   要求:整數,且在2~36之間。
        若radix 大於36 或者 小於2且不等於0 ,那麼直接返回NaN,
        若radix爲0 ,則按照10進制來解析。
        若radix爲字符串,則把這個先parseInt,再解析。
2. 不傳參
   若要解析的字符串以'0x''0X'開頭,那麼以16進制解析。
   其他狀況按10進制解析。複製代碼

實際用法spa

// 1. 正常全解析
parseInt("123");        // 123
parseInt("489",10);     // 489
parseInt("1010",2);     // 10
parseInt("a01",16);     // 2561 1+0+10*16*16
parseInt("0xa01");      // 2561
parseInt("123",0);      // 123
parseInt("123","5");    // 38
parseInt("123","5.2");  // 38

// 2. radix不在範圍內返回NaN
parseInt("123",1);      // NaN
parseInt("123",37);     // NaN

// 3. 因進制問題返回字符串部分解析結果
parseInt("102",2);      // 2
parseInt("10ac",10);    // 10

// 4. 因進制問題返回NaN
parseInt("a10",10);     // NaN複製代碼

注意code

每種進制在 位上 都有它合理的取值範圍,如:十進制,每一位的取值爲0-9,十六進制爲0-f,超出取值範圍則不承認。索引

parseInt在解析字符串時,按照字符順序一個一個檢查,若是第一個字符就爲超範圍的值,則直接返回NaN,若不是則檢查下一位,直到檢查完畢或者碰到某一位值超範圍,而後將檢查過的不超範圍的字符串解析,後面的捨棄。如:parseInt("456a23",10); 字符檢查到a時,發現超出範圍,則將從a之後的捨棄,只返回「456」的解析結果。字符串

2. map

map()方法返回一個新數組,數組中的元素爲原始數組元素調用函數處理的後值。
string

map()方法按照原始數組元素順序依次處理元素,它不處理空數組,也不會改變原始數組。

語法

arr.map(function(item,index,arr),thisValue)

第一個參數爲數組值循環的處理函數,每一個值都通過此函數處理,item是當前值,index是當前值得索引值,arr是當前數組,其中item爲必選參數,index與arr爲可選參數

實際使用

var arr = [1,-2,3]
var newArr = arr.map((item,index)=>{
    return item>0?item:-item;  // 將數組元素變成正數後返回
})
newArr; // [1,2,3] 
複製代碼

3. 當map趕上了parseInt

[1,2,3].map(parseInt)

注意: 傳參

parseInt做爲map的處理函數,map是能夠向其傳遞三個參數的,分別爲item,index,arr

而parseInt是能夠接收到兩個參數的,因而乎,parseInt在接受參數時,接受了map傳遞過來的item和index

因此,var arr=['1','2','3']在map中每次解析其實在運行 parseInt(arr[index],index)

parseInt('1',0) // 按十進制解析 返回1
parseInt('2',1) // radix<2  返回NaN
parseInt('3',2) // 被解析字符串首個字符就不在二進制合理取值範圍內,返回NaN複製代碼
相關文章
相關標籤/搜索