SSブログ

Javascriptの配列 [プログラミング]

Javascriptで配列を扱うには、クラスArrayを使います。

var a = new Array();

a[0] = 1;
a[1] = "a";

添え字([ ]の中)は、0からの連番になっているので、大きさ(要素数)が"N"の配列では、添え字に0~N-1が使えます。

とは言え、配列の大きさは必要に応じて自動で増えていくので、あまり気にすることはありません。

ところで、
某有名サイトでは、Javascriptの配列(Array)の説明に、次のようなことが書いてありました。

(Javascriptの配列では)添え字に文字列を指定することが出来ます。

つまり、こんな↓使い方も出来るという事です。

var a = new Array();

a["apple"] = "りんご";
a["banana"] = "バナナ";

ふ~ん。
配列の添え字として、0からの連番の数値と文字列を混在できるんだ。
変な仕様。

話は変わり、先日のこと。
こんな関数を見かけました。

// 配列の要素数を返す。
// a : 配列 (Array)
function getArraySize(a)
{
    var n = 0;

    for (var i in a) {
        n = n + 1;
    }

    return n;
}

なぜ、わざわざループを回して1つずつ数え上げているのだろう……。

非常に無駄な処理なので、書き換えました。

// 配列の要素数を返す。
// a : 配列 (Array)
function getArraySize(a)
{
    return a.length;
}

本当は、関数呼び出しもなくしたい所なのですが、面倒なので止めました。

そして、

………
………
………

正しく動かなくなりました(T_T)

何故?どうして?Why?

書き換えた関数の戻り値を表示してみると、常に0を返しています。

試しに、こんな↓コードを書いて実行して見ました。

var a = new Array();

a["apple"] = "りんご";
a["banana"] = "バナナ";

alert(a.length);    // ⇒ 0 と表示する


やはり「0」です。

var a = new Array();

a["apple"] = "りんご";
a["banana"] = "バナナ";
a[0] = "0";

alert(a.length);    // ⇒ 1 と表示する

??

var a = new Array();

a[100] = "0";
a["apple"] = "りんご";
a["banana"] = "バナナ";

alert(a.length);    // ⇒ 101 と表示する

もしかして、lengthプロパティの値は、添え字が数値の要素の個数だけですか?
ますます変な仕様。

あまりに変な挙動だったので、Javascriptの言語仕様を調べてみました。

………
………
………

だーまーさーれーたーっ!

………
………
………

配列の添え字に文字列は使えません。
使えるように見えるけど、それは別物、配列要素へのアクセスではありません。

Javascriptの世界では、[ ]の間に文字列を指定すると、そのオブジェクトのプロパティ(メソッドも含む)の参照になります。

a["apple"]は、a.apple と同じ扱いになります。
違いは、存在しないプロパティを指定した場合にエラーとするか(.(ドット)記法)、新規に追加するか([ ]記法)です。
(あと、[ ]なら空白や記号もプロパティ名として使用できます)

これは、Array型に限らず全てのオブジェクトが対象なので、Array以外のオブジェクトでも使うことが出来ます。

var a = new Date();    // ← 日付クラス

a["apple"] = "りんご";
a["banana"] = "バナナ";

これ↑でもOKです。

で、あるなら、

var a = new Array();

a["apple"] = "りんご";
a["banana"] = "バナナ";

alert(a.length);    // ⇒ 0 と表示する

これは、
applebananaというプロパティを持った要素数 = 0の配列
です。
a.lengthが0となっているのは、正しかったのです。

さて、
["~"]の記法が、プロパティの参照であろうが、配列要素の参照であろうが、結果として同じ様に振舞うのなら気にすることは無い』
と考える御仁もいらっしゃることでしょう。

しかし、
["~"]がプロパティの参照であるなら、既存のプロパティに影響を与えるということを無視する訳にはいきません。

var a = new Array();

a["length"] = "長さ";

これ↑はエラーです。

var a = new Array();

a["sort"] = "並べ替え";

これはエラーになりませんが、この後で、a.sort()とするとエラーになります。

また、 for (i in a) { } はプロパティの列挙を行う文法ですが(Array型はプロパティと配列要素の両方の列挙)、列挙できないプロパティがある(標準で持っているプロパティは対象外?)というのも見逃せません。

なので、
どうしても文字列を添え字とする配列が欲しければ、
Array等の既存クラスを使うのではなくて、
プロパティを一切持たないクラスを作って代用しなければならないのです。

var array = function() { };

array["apple"] = "りんご";
array["banana"] = "バナナ";

メソッドも持てないので、使い勝手を良くするなら、ラッパクラスを作るのが良いでしょうね。
それについては次回。

最後に、
大事な事なので、もう1回繰り返しておきます。

Javascriptの配列で添え字に指定できるのは、0以上の整数値だけです。
文字列は指定できません。

[車(セダン)] 今日の一冊
タブー禁忌

タブー禁忌

  • 作者: 佐藤 亜有子
  • 出版社/メーカー: 河出書房新社
  • 発売日: 2000/09
  • メディア: 単行本(ソフトカバー)

タグ:JavaScript
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

実数の剰余Javascriptで連想配列 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。