配列の定義

JavaScriptでは配列をオブジェクト(Array)として扱われます。定義の方法は2つあって、配列リテラル式のブラケット([])で生成する方法とnew式でArrayコンストラクタを呼び出して生成する方法があります。

// 配列ブラケット式生成
var foo = [];
console.log(foo);

// new式生成
var bar = new Array();
console.log(bar);

どちらもArrayインスタンスができあがるので同じなのですが、配列リテラル式のブラケット([])で生成する方法が好まれるようです。処理速度の差はなく、コードの可読性をよくするのが目的なのだと思います。ちなみに私は開発エディタにPHPStormを使用しているのですが、new式で生成した場合、以下のようなメッセージが出ました。

Array instantiation can be simplified.
Checks for improper usage of wrappers for JavaScript primitive types. Also, warning will be produced when property of primitive type is modified, as assigned value will be lost.

「配列のインスタンス化を簡素化できます。
JavaScriptプリミティブ型のラッパーの不適切な使用をチェックします。また、プリミティブ型のプロパティが変更された場合、割り当てられた値が失われるため、警告が生成されます。」

配列のインスタンス化をシンプルに書くように促してくるのもあるので、配列の生成には配列リテラル式を使うようにしようと思います。

配列に格納できる値

配列に格納するデータ型には制約がありません。文字列型・数値型・論理型だけでなく、オブジェクトや関数も保持することができます。

var foo = ['bar', 100, true, {'a': 'b'}, ['baz', 'barbaz'], function(a,b){return a + b;}];
console.log(foo);

配列に格納できる数の上限は「0から232-1までの間の整数値」とあります。以下、MDNのArrayオブジェクトページの説明から引用。

Arrayコンストラクタに0から232-1までの間の整数値1個が与えられた場合、その数値の要素数を持つ新しいJavaScript配列が生成されます。それ以外の数値が与えられた場合、RangeErrorがthrowされます。

[引用] MDN:Array

この記述だとnew式でArrayオブジェクトのインスタンスを生成して際のコンストラクタの上限値とも読み取れそうな気がするのですが、まぁそれほど大きい数を保持させるような処理が出ることはないかなと思うので、認識だけしておくことにします。

配列へのアクセス

JavaScriptの配列の添え字は0から始まります。

var foo = ['bar', 'baz'];
console.log(foo[0]);
console.log(foo[1]);
console.log(foo[2]);

要素のない添え字を指定すると(例の場合、foo[2])undefined値になります。エラーになるわけではありません。

多次元配列

JavaScriptで多次元配列を実現するには、配列に配列オブジェクトを格納してあげればよいです。以下、定義と要素へのアクセス方法。

var foo = [
    ['foo', 'foofoo'],
    ['bar', 'barbar']
];
console.log(foo[0][0]);  // foo
console.log(foo[0][1]);  // foofoo
console.log(foo[1][0]);  // bar
console.log(foo[1][1]);  // barbar

例は2次元配列ですが、3次元も4次元もいけるようです。そこまでカオスな配列を使用するシステムが現れるだけでもゾッとしますけど。配列はシンプルにしたい。

連想配列

JavaScriptでは連想配列(添え字が文字列)が使用できます。

var foo = [];
foo['bar'] = 'barbar';
foo['baz'] = 'bazbaz';

console.log(foo['bar']);  // barbar
console.log(foo['baz']);  // bazbaz

連想配列の場合、静的な添え字であればドット記法で要素にアクセスできます。ただし添え字が数字から始まる場合、構文エラーになってしまいますのでブラケットに文字列の方が無難な気がします。

var foo = [];
foo['bar'] = 'barbar';
foo['1ba'] = 'bazbaz';

console.log(foo.bar);  // barbar
console.log(foo.1ba);  // Uncaught SyntaxError: Invalid or unexpected token