chromeでnative版とjQuery版のベンチを取ってみたら倍ぐらい違ったのでjQueryを使わないで実装。native版とほぼ変わらない実行速度になりました。
if( typeof Array.prototype.map === 'undefined') Array.prototype.map = function($callback){ var len = this.length; var $_ = new Array(len); for(var i =0; i
コールバックについて2点ほど…
一つ目は、コールバック関数の引数。ECMAScript 5thのArray.prototype.mapの仕様では、コールバックには3つの引数が渡されます。最後の引数には配列自身が入ります。
[1,2,3,4].map(function(a,b,c){ return a + c[b] })
は [2,4,6,8] を返します。
二つ目は、コールバック関数のthisについて。コールバック関数はデフォルトでグローバルコンテキストで実行されます。
var x = 1; [1,2,3,4].map(function(a){ return this.x + a });
this.x は 1 となり [2,3,4,5] が返ります。実行コンテキストの指定も可能です。
[1,2,3,4].map(function(a){ return this.x + a }, {x : 2});
とするとコールバックの this は {x:2} となり [3,4,5,6] が返ります。
まとめると
if( typeof Array.prototype.map === 'undefined') Array.prototype.map = function($callback){ var len = this.length; var $_ = new Array(len); for(var i =0; i<len; i++){ $_[i] = $callback.call(arguments[1],this[i],i,this); } return $_; };
mapとかfilterとかforEachのネイティブ実装が無い実行系で自前実装するならばMDNにあるコードをパクるのが良いと思います。
https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Array/map