新JavaScript入門  JavaScript,Neo-Generation  DOM  WSH  掲示板  表紙
4.値と変数  6.配列(2) 
新JavaScript入門
5. 配列(1)
配列の作り方
前回黙って配列を使ってしまいましたが、 配列は次のように生成します。
    var a = new Array(array-length);
 
このように配列は配列の長さを引数とする Array 型のオブジェクトとして生成します。
配列の要素へのアクセス方法はCと同じです。
    a[expression]
 
添字は 0 〜 array-length - 1 です。
    var name = new Array(5);        //名前
    var score = new Array(5);       //点数
    name[0] = "さくら"; score[0] = 88;
    name[1] = "知世";   score[1] = 90;
    name[2] = "千春";   score[2] = 92;
    name[3] = "奈緒子"; score[3] = 91;
    name[4] = "利佳";   score[4] = 93;
    
    //次の名前の生徒の点数を探し出して表示する
    tmpname = "さくら";
    for(var i = 0; i < 5; i++)
        if(name[i] == tmpname) {    //名前が一致したら
            alert(score[i]);        //表示
            return;
        }
 
配列の長さ
配列の長さは length プロパティで得られます。
    var a = new Array(3);   //長さ3を確保
    alert(a.length);        //3
    a[5] = 1;               //6番目の要素に代入すると
    alert(a.length);        //長さ6になる
 
配列の長さは Array オブジェクトを作るときに いちおう決められますが、その範囲を超える要素にもアクセスできます。 おそらく、最初に長さを指定するのは、 length プロパティを設定する以外に意味が無く (別に3個分の領域を確保しているわけではない)、
    var a = new Array();
 
としても何ら問題無いと思われます。 そして length プロパティにも 現在最大何番目の要素が定義されているかという意味しかないのでしょう。

ただし、 length プロパティを小さくすると、 値が未定義になってしまうことがあります。

    var a = new Array();
    a[0] = "ケロちゃんの";
    a[1] = "役立たず";
    alert(a[0] + a[1]);     //この時点では長さ2
    a.length = 1;           //長さ1とすると
    alert(a[0] + a[1]);     //a[1]が未定義に
 
連想配列的に使う
実は添え字に0以上の整数だけでなく、文字列も使えます。
 function test4(form) {
    var a, str;
    
    a = new Array();
    a["aaa"] = 4;   //文字列を添え字に
    a.abc = 5;      //プロパティの形でも
    alert(a.aaa);   //どちらの形でもアクセスできる
    str = "abc";
    alert("" + a[str]);
 }
 
この添字に文字列を使うのは、プロパティの別の形と思われます。 というより、通常の添え字もおそらくプロパティで、 length プロパティに影響を及ぼすかもしれない、 という違いしかないのではないでしょうか。 つまり通常の添え字も自動的に文字列に変換されているのかもしれません。
 function test5(form) {
    var a, str;
    a = new Array();
    a[0] = 0; a[1] = 1; a["3"] = 2;
    alert(a.length);    //上は通常の配列
    alert(a["0"]);      //a[0]と同じ
    alert(a["1.0"]);    //a[1]とは違う
 }
 
これで配列が実際にどう実装されているのかは分かりませんが、 とにかく使うと便利です。
次の例は、一番上の例と同じです。対比してみてください。
    var score = new Array();
    score["さくら"] = 88;       //名前を添え字に
    score["知世"] = 90;
    score["千春"] = 92;
    score["奈緒子"] = 91;
    score["利佳"] = 93;
    
    //こちらが検索する必要はない
    tmpname = "さくら";
    alert(score[tmpname]);      //一発で表示
 
まとめると、
Array 型オブジェクトは通常の配列ではなく、 連想配列のようなものである。 ただし、添え字が0以上の整数またはそれをそのまま文字列にしたものの場合、 通常の配列であるかのようにふるまう。
このために、JavaScriptの Array 型オブジェクトはアクセスが非常に遅くなってしまいます。 これはVBScriptと比べてみるとわかるでしょう。
    var n = 50000;
    var a = new Array();
    var sum = 0;
    for(var i = 0; i < n; i++)
        a[i] = i;
    
    for(i = 0; i < n; i++)
        sum += a[a[i]];
    
    alert(sum);
 
    Dim n, sum, i
    Dim a(49999)
    sum = 0
    n = 49999
    For i = 0 To n
        a(i) = i
    Next
    
    For i = 0 To n
        sum = sum + a(a(i))
    Next
    
    MsgBox sum
 
下がVBScript版ですが、うちの環境で3倍くらい速いです。
Written 10/5/97
Modified 4/24/99
Modified 4/5/03
first, prev, next, exit