人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

JavaScriptの質問です。

────────────────────
var hoge = [];
hoge['a'] = ['b'];

alert(hoge.length + " : " + hoge['a']);
────────────────────
上記のようなスクリプトを走らせた場合、アラート文として表示される結果は
────────────────────
0 : b
────────────────────
になります。

hoge['a']の中身が "b" という結果が確かに返ってきているので、配列hogeの中には一件の値が入っているはずです。
なのに、hoge.lengthが 0 とされてしまうのは、なぜでしょうか?


●質問者: nacbox
●カテゴリ:ウェブ制作
✍キーワード:hoge JavaScript アラート スクリプト 配列
○ 状態 :終了
└ 回答数 : 3/4件

▽最新の回答へ

1 ● imo758
●36ポイント

JavaScriptの配列をも〜っと深く理解する:lengthの不思議な動作

http://builder.japan.zdnet.com/script/sp_javascript-kickstart-20...

が参考になるのではないでしょうか

◎質問者からの返答

でぇぇぇ!!

完全に予想外の答え……。


てことは……

てことは……

件数を数えようと思ったら、for?inでぐるぐる回してカウントするしかないということ??


2 ● Galapagos
●10ポイント

それは、hoge が配列として宣言されていないからです。


hoge を配列として扱うためには、以下のようにします。

ここでは要素数5の配列として宣言してみます。

var hoge = new Array(5);
hoge['a'] = ['b'];

alert(hoge.length + " : " + hoge['a']);
◎質問者からの返答

上記だと、確かに件数は5件と出ます。

ですがこの場合は、初めから件数が分かってるという前提ですよね。

たとえば、hoge.push()でどんどん配列に値が追加されるような場合

(そしてその格納される値の大きさが、連番などではなく大きな数字の場合)、

imo758さんの回答されたURL先の情報にならうと、

lengthの値は件数と同一ではなくなってしまうのではないのでしょうか。


3 ● y-kawaz
●36ポイント ベストアンサー

配列(Array)では数字のインデックスしか使えません。

数字以外のインデックスへのアクセスは、そのオブジェクトのプロパティへのアクセスとして扱われます。

で、配列のlengthプロパティはあくまで配列のサイズを返すものであり、オブジェクト自身のプロパティの数を返すわけではないのでゼロになります。

ちょっと分かりにくいかもしれませんが、配列もオブジェクトなのでこのようなことができてしまいます。


オブジェクトのプロパティの数を数えたいなら、例えば以下のようにすれば数えられます。

function countProperty(obj) {
 var count = 0;
 for(var p in hoge) {
 if(hoge.hasOwnProperty(p)) {
 count++;
 }
 }
 return count;
}

var hoge = [];
hoge.a = 'b'; // hoge['a'] = 'b' と同じ
alert(hoge.a); // bが表示される
alert(hoge.length); // 0が表示される
alert(countProperty(hoge)); // 1が表示される

hoge.push('c')
alert(hoge[0]); // cが表示される
alert(hoge.length); // 1が表示される
alert(countProperty(hoge)); // 2が表示される(0と"a"で2つ)
◎質問者からの返答
 hoge.a = 'b'; // hoge['a'] = 'b' と同じ

おおお……。

なるほど、目の前の靄が晴れた気分です。


結局、数を数えようと思ったら、for?inでぐるぐる回すしかなさそうですね。

カウントする部分を関数化してしまうのは、イタダキです。


だいたい疑問点は解消できました。

ありがとうございました!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ