2010年04月28日 22:00 [Edit]

javascript - Array.prototype.slice.apply(arguments) // 引数一発配列化

これなのですが…

細かいJavaScriptの仕様や習慣やテク集 - 三等兵
var func = function() {
  var leng = arguments.length;
  for(var i = 0, arr = []; i < leng; i++){
    arr[i] = arguments[i] * 10;
  }
  alert(arr);
};

こう書けます。

var func = function() {
  var args = Array.prototype.slice.apply(arguments);
  var arr  = args.map(function(n){ return n * 10 });
  alert(arr);
};
func(1,2,3,4);

このテクニック、

としても分かるようにJSハカーの間では結構知られてはいたのですが、見ての通り解説もそれほど見当たらないのでentryを起こした次第。JavaScript: The Good Partsにもサイ本にも載ってませんねえ。argumentsがArrayでないことに関する文句は双方とも書いてあるのに。

あと、おまけですが

細かいJavaScriptの仕様や習慣やテク集 - 三等兵
var a=[1,2];
var b=a.slice();
a.pop();
alert([a.length,b.length]);//1,2

なのですが、要素がオブジェクトの場合、こうなります。

var a=[1,[2]];
var b=a.slice();
a[1][1] = 3;
a.pop();
alert(uneval(a)); /* [1] */
alert(uneval(b)); /* [1,[2,3]] */

完全なコピーが欲しい場合には、var copy = eval(uneval(array));などとするのがよいでしょう。

Dan the Javascripter


この記事へのトラックバックURL

この記事へのコメント
JavaScript: The Good Parts の 4.14 カリー化(p50)に載ってましたよ。

解説とまでいえるかは、分かりませんが。
Posted by tnpk_mnpk at 2010年05月10日 06:47

mapは、今、直接関係ないか・
Posted by p-1956050 at 2010年04月28日 23:11
IEでデフォルトでは、mapが使えないからでは?
Posted by p-1956050 at 2010年04月28日 23:03