問題:--js (['1','2','3']).map(parseInt)
第一眼看到這個題目的時候,腦海跳出的答案是 [1, 2, 3],但是真正的答案是[1, NaN, NaN]。
首先讓我們回顧一下,map函數的第一個參數callback:
var map = arr.map(function callback(currentValue[, index[, array]]) { // Return element for new_array }[, thisArg])
這個callback一共可以接收三個參數,其中第一個參數代表當前被處理的元素,而第二個參數代表該元素的索引。
-
而parseInt則是用來解析字符串的,使字符串成為指定基數的整數。
parseInt(string, radix)
接收兩個參數,第一個表示被處理的值(字符串),第二個表示為解析時的基數。 -
了解這兩個函數后,我們可以模擬一下運行情況
- parseInt('1', 0) //radix為0時,且string參數不以“0x”和“0”開頭時,按照10為基數處理。這個時候返回1
- parseInt('2', 1) //基數為1(1進制)表示的數中,最大值小於2,所以無法解析,返回NaN
- parseInt('3', 2) //基數為2(2進制)表示的數中,最大值小於3,所以無法解析,返回NaN
- map函數返回的是一個數組,所以最后結果為[1, NaN, NaN]
上面的可能有點抽象,現在讓我們用實力說話
- map的回調函數到底返回那些參數,我們用一個匿名函數加arguments去看map的callback返回那些參數
- 上圖可知,map函數中篩選總共執行了三次,每次都要傳遞了三個實參,當前元素,索引,數組本身
- 然后我們將上圖的匿名函數換成parseInt,可知parseInt接收了三個參數(但parseInt的形參只有兩個即:1,0)
- 研究parseInt怎么會得出NaN
- 綜上所述,研究完畢