這是一道前端面試題,看到這個問題第一反應結果是否是 [1,2,3],可是真正的結果是[1, NaN, NaN],爲何呢?首先看下 Array.map() 函數在 MDN中 的定義前端
map()方法返回一個新數組,其結果是該數組中的每一個元素都調用一個提供的函數後返回的結果面試
var arr = [1, 2, 3];
var arr1 = arr.map(x => x * 1);
console.log(arr1); // 1,2,3
複製代碼
能夠看出 map 方法中接受一個函數 function,用來處理遍歷數組中的每個元素數組
var new_array = arr.map(function callback(currentValue[, index[, array]]) {
// Return element for new_array
}[, thisArg])
複製代碼
這個 callback 一共能夠接收三個參數,第一個參數 currentValue 是數組中正在處理的當前元素,第二個參數 index 是數組中正在處理的當前元素的索引,第三個參數 array 是map
方法被調用的數組markdown
thisArg 可選,執行 callback 函數時使用的 this 的值函數
radix 解析字符串的基數,基數規則以下:ui
parseInt('123', 5) // 將'123'看做 5 進制數,返回十進制數38 => 1*5^2 + 2*5^1 + 3*5^0 = 38
複製代碼
parseInt("0xf") // 15
複製代碼
parseInt("08") // 0 * 8 的 1 次方 + 8 * 8 的 0 次方 = 8
複製代碼
parseInt("88.99f") // 88
複製代碼
parseInt("10.33") // 10
複製代碼
parseInt(" 69 10 ") // 69
複製代碼
parseInt("f") // NaN
parseInt("f", 16) // 15
複製代碼
['1', '2', '3'].map(parseInt) 至關於this
['1', '2', '3'].map(function(cur,index){
return parseInt(cur, index)
})
複製代碼
那麼代碼執行的是spa
parseInt('1', 0); // radix 爲 0 時,使用默認的 10 進制 -> 1
parseInt('2', 1); // radix 值範圍在 2-36,沒法解析,超出區間範圍 -> NaN
parseInt('3', 2); // radix 爲 2,用 2 進制來解析,應以 0 和 1 開頭,最大值小於 3,沒法解析 -> NaN
複製代碼
所以最終結果是:[1, NaN, NaN]
code