最近看map實現原理,javascript
Array.prototype._map = function(fn, context) { console.log(fn, context) var temp = []; if(typeof fn == 'function') { var k = 0; var len = this.length; for(; k < len; k++) { temp.push(fn.call(context, this[k], k, this)) } } else { console.error('TypeError: '+ fn +' is not a function.'); } return temp; }
map接受兩個參數,一個fn函數,一個是obj目標對象,這裏context爲undefined,經過fn.call(undefined,arg1,arg2)把改變this指向爲window,把參數傳入fn。上面this[k], k, this,this爲數組,this[k]爲數組的值,k爲下標index。能夠經過java
[1,2,3].map(function(item, index, obj){console.log(item, index,obj)})
來查看參數面試
這裏有個經典面試題,數組
var newArr = ['1', '2', '3']._map(parseInt) console.log(newArr) // [1, NaN, NaN]
下面解釋下爲何,這裏因爲parseInt是能夠接受第二個參數的,這個參數爲0的時候爲十進制且2到36之間,咱們按照數組循環來查看一下parseInt的參數,第一次三個參數‘1’,0,['1','2','3'],顯然這裏結果爲1,第二層‘2’,1,['1','2','3'],這裏爲NaN,第三次‘3’,2,['1','2','3'],運行爲parseInt(‘3’,2),顯然爲NaN函數