今天看見一道面試題:["1","2","3"].map(parseInt)
答案是多少?
答案是[1,NaN,NaN]
面試
對map()方法不太瞭解就去搜了一下:Array.prototype.map(),裏面也包含了對這道面試題的詳解。數組
map()方法返回一個由原數組中的每一個元素調用一個指定方法後返回值組成的新數組。函數
array.map(callback[,thisArg])
具體參數上面的連接中能看見,也就不重複了。this
map 方法會給遠數組中的每一個元素都按順序調用一次 callbak 函數。 callback 每次執行後的返回值(包括 undefined )組合起來造成一個新數組。 callback 函數只會在有值的索引上被調用,那些歷來沒被賦過值或者使用 delete 刪除的索引則不會被調用。prototype
callback 函數會被自動傳入三個參數:數組元素,元素索引,原數組自己。code
若是 thisArg 參數有值,則每次 callback 函數被調用的時候, this 都會指向 thisArg 參數上的這個對象。若省略了 thisArg 參數,或者賦值爲 null 或 defined,則 this 指向全局對象。對象
map 不修改調用它的原數組自己(固然能夠在 callback 執行時改變原數組)。索引
使用 map 方法處理數組時,數組元素的範圍在 callback 方法第一次調用以前就已經肯定了。在 map 方法執行的過程當中:原數組中增長的元素將不會被 callback 訪問到;若已經存在的元素被改變或者刪除,則它們的傳遞到 callback 的值是map 方法遍歷到它們的那一時刻的值;而被刪除的元素將不會訪問到。ip
這個時候就很好理解爲何最後的返回值是[1,NaN,NaN]
了,由於使用parseInt
時,是能夠傳遞兩個參數的,第一個參數是被解析的值,第二個參數是進制數。map
方法在調用callback函數時,會給它傳遞三個參數:當前正在遍歷的元素,元素索引,原數組自己,第三個參數parseInt
會忽視,但第二個參數,會把傳遞過來的索引值當作進制數來使用。因此結果是這樣element
若是想要獲得正確的值,能夠這樣:
function returnInt(element){ return parseInt(element,10); } ["1", "2", "3"].map(returnInt); // 返回[1,2,3]
感受這個函數和Array.prototype.forEach()
有點像。。詳情Array.prototype.forEach()