“arguments” – Alphabetical Advent Calendar 2013
この記事は賞味期限切れです。(更新から1年が経過しています)
“A” は arguments の “A”。
arguments とは
arguments は関数内で自身に渡された引数を取得する為のオブジェクトです。 可変長引数をとる関数を書きたい時や、コールバックに渡された引数を調べる時などに重宝します。
function foo(){
for(var i=0; i<arguments.length; i++){
console.log(arguments[i]); // "a", "b", "c"
}
}
foo("a", "b", "c");
配列ライクなオブジェクト
arguments の特徴は、
- length プロパティがある
- 添字(0-)で値を参照できる
となっていて、一見配列に似ているのですが、実際はArrayのようでArrayではないほんのちょっとだけArrayな「Arrayライク」オブジェクトとされています。 Arrayではないので、Arrayに定義されているメソッド群は使うことができません。
arguments.join(","); // Object #<Object> has no method 'join'
配列のメソッドを使いたい場合は、argumentsをArrayに変えてあげる必要があります。 その為によく使用されるのが Array の slice メソッドです。
function foo(){
var args = Array.prototype.slice.call(arguments);
return args.join(",");
}
foo(1,2,3); // "1,2,3"
Array の slice メソッドをお借りする事で、arguments を配列に変換した args を定義する例です。 これで args で配列の便利なメソッド群を使うことが出来るようになりました。
for-in ループ
主なブラウザでは arguments をfor-inループで回す事が出来る様ですが、IE8では正常に動きませんでした。 なので、対応したい場合は先述の様に一旦配列に変換する必要がありますね。
function foo(){
var i;
for(i in arguments){ // IE8では動作しない
console.log(arguments[i]);
}
}
簡単な例
可変長引数のサンプルとして、文字列をフォーマットする関数を定義してみましょう。
function sprintf(){
var args = Array.prototype.slice.call(arguments);
return args.shift().replace(/%s/g, function(){
return args.shift() || "";
});
}
sprintf("Hello, %s !", "World"); // "Hello, World !"
sprintf("Hello %s, I'm %s, %s years old.", "Tom", "John", "23");
// "Hello Tom, I'm John, 23 years old. "
他言語にあるような sprintf 関数の “%s” だけをエミュレートしてみた簡単なコードです。 引数の数やタイプが可変するような場合は arguments オブジェクトにお世話になる事でしょう。
コメント