Javascriptで知っておくべき知識  > 配列とオブジェクトと連想配列

2006年09月21日

配列とオブジェクトの略式(前提知識)

配列型(Array)とオブジェクト型(Object)のオブジェクト作成は通常書く場合、

var array = new Array();

var object = new Object();

※宣言時の ( ) は省略できますが、「Ajax専」では付ける方向で統一します。

と記述しますが、これには略式があり

var array = [];

var object = {};

このように記述することができます。

配列(Array型)(確認事項)

配列で初期値の宣言をするときは、

var array = ['A','B','C'];

このように記述します。そうすると、

alert('value->'+array[0]); // value->A

alert('value->'+array[1]); // value->B

alert('value->'+array[2]); // value->C

alert('length->'+array.length); // length->3

となります。また、配列に追加する場合には、

array.push('D');

alert('value->'+array[3]); // value->D

alert('length->'+array.length); // length->4

となります。更にループさせると、

for (var i = 0; i < array.length; i++){

  alert('value->'+array[i]);

}

ここはまだまだ序盤。

オブジェクト(Object型)(確認事項)

同様にオブジェクトで初期値の宣言をするときは、

var object = {a:'A',b:'B',c:'C'};

このように記述します。そうすると、

alert('value->'+object.a); // value->A

alert('value->'+object.b); // value->B

alert('value->'+object.c); // value->C

となります。同様に追加する場合は、

object.d = 'D';

alert('value->'+object.d); // value->D

となります。更にループさせると、

for (var i in object){

  alert(object[i]);// iにはa,b,c,dが入っている

}

さて、ここまでで基本的な確認事項は終わりです。

連想配列(重要)

ここからが本題。連想配列と言えば、

human['name']

こんな感じで記述できるのが連想配列です。さて、この連想配列はArray型?Object型?

実はArray型で宣言してもエラーが出るわけではないので気づきにくいですが、Object型が正解です。というよりもそもそも連想配列なんてものはJavascriptには存在しません。

上記の例を別の記述に変えると分かりやすいですが、

human.name

となります。もうそのままObject型ですね。オブジェクトの説明の例を別の書き方にすると、

var object = {a:'A',b:'B',c:'C'};

object['d'] = 'D';

このように記述できるわけです。ここで、「あれ?Array型と似てるな」と思った人は鋭い人です。Array型の簡易実装を記述すると、

var array = {0:'A',1:'B',2:'C'}

array[3] = 'D';

alert('value->'+array[0]); // value->A

alert('value->'+array[1]); // value->B

alert('value->'+array[2]); // value->C

alert('value->'+array[3]); // value->D

このような記述もできます。このObjectにlengthやpush、sort等のメソッドを追加したのがArray型になります。pushメソッドは、最後尾に挿入すると同時にlengthに+1している訳です。ただし、名前に制約がある(変数で付けられる名称以外は不可)ので

array.0

のようなアクセスは許されません。逆にいうと [ ] を用いた記述の場合、

var object = [];

object['漢字'] = 'A';

alert(object['漢字']);

このような記述は可能となります。つまり、Array型はもちろんObject型も全て連想配列的な記述に変換することが可能です。これは色々応用できる知識です。

まとめ

何故このようなエントリーをしたかというと、prototype.jsではArray型はprototype宣言で拡張されており、連想配列だからといってArray型で宣言してしまうと、for-inループした際ひどいことになるからです。

とはいえ、利便性のため、「Ajax専」ではobject[name]のような記述は連想配列と呼びます。


【トラックバック】

このエントリーのトラックバックURL: