Array.prototype.map

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