arguments
配列のようなオブジェクトと言われています。すでに見たように、インデックスによってその要素にアクセスできますが、すべての Array メソッドを自由に使用できるわけではありません。配列のようなオブジェクトの他の例は、getElementsByTagName() または getElementsByClassName() によって返される HTML コレクションです。jQuery を使用したことがある場合は、配列のようなオブジェクトでもあります。いくつかの DOM オブジェクトにクエリを実行した後、DOM タブで Firebug を使用して結果の jQuery オブジェクトを調べると、私の言いたいことがわかるでしょう。
Meeboの問題に対する私の解決策は次のとおりです。
function conc(){
if (arguments.length === 0)
return "";
else
return Array.prototype.slice.call(arguments).join(" ");
}
alert(conc("a", "b", "c"));
Array.prototype.slice.call(arguments)
arguments
を真の Array オブジェクトに変換するための優れたトリックです。Firefox ではArray.slice.call(arguments)
十分ですが、(少なくとも) IE6 では動作しないため、通常は以前のバージョンが使用されます。また、このトリックは、(少なくとも) IE6 の DOM API メソッドによって返されるコレクションでは機能しません。エラーがスローされます。ちなみに、代わりcall
にapply
.
配列のようなオブジェクトについて少し説明します。JavaScript では、ほとんど何でもオブジェクトのメンバーに名前を付けることができ、数字も例外ではありません。したがって、完全に有効な JavaScript である次のようなオブジェクトを作成できます。
var Foo = {
bar : function() {
alert('I am bar');
},
0 : function() {
alert('I am 1');
},
length : 1
}
上記のオブジェクトは、次の 2 つの理由から配列のようなオブジェクトです。
- 名前が数字のメンバーがあるため、配列インデックスのようなものです
- それには
length
プロパティがあり、それがないと、オブジェクトを構文を使用して真の配列に変換することはできません。Array.prototype.slice.call(Foo);
Function オブジェクトの arguments オブジェクトは Foo オブジェクトによく似ていますが、特別な目的があるという点だけが異なります。