────────────────────
var hoge = [];
hoge['a'] = ['b'];
alert(hoge.length + " : " + hoge['a']);
────────────────────
上記のようなスクリプトを走らせた場合、アラート文として表示される結果は
────────────────────
0 : b
────────────────────
になります。
hoge['a']の中身が "b" という結果が確かに返ってきているので、配列hogeの中には一件の値が入っているはずです。
なのに、hoge.lengthが 0 とされてしまうのは、なぜでしょうか?
配列(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つ)
JavaScriptの配列をも〜っと深く理解する:lengthの不思議な動作
http://builder.japan.zdnet.com/script/sp_javascript-kickstart-20...
が参考になるのではないでしょうか
でぇぇぇ!!
完全に予想外の答え……。
てことは……
てことは……
件数を数えようと思ったら、for~inでぐるぐる回してカウントするしかないということ??
それは、hoge が配列として宣言されていないからです。
hoge を配列として扱うためには、以下のようにします。
ここでは要素数5の配列として宣言してみます。
var hoge = new Array(5); hoge['a'] = ['b']; alert(hoge.length + " : " + hoge['a']);
上記だと、確かに件数は5件と出ます。
ですがこの場合は、初めから件数が分かってるという前提ですよね。
たとえば、hoge.push()でどんどん配列に値が追加されるような場合
(そしてその格納される値の大きさが、連番などではなく大きな数字の場合)、
imo758さんの回答されたURL先の情報にならうと、
lengthの値は件数と同一ではなくなってしまうのではないのでしょうか。
配列(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でぐるぐる回すしかなさそうですね。
カウントする部分を関数化してしまうのは、イタダキです。
だいたい疑問点は解消できました。
ありがとうございました!
回答者 | 回答 | 受取 | ベストアンサー | 回答時間 | |
---|---|---|---|---|---|
1 | <textarea> | 1回 | 0回 | 0回 | 2011-03-09 16:04:13 |
おおお……。
なるほど、目の前の靄が晴れた気分です。
結局、数を数えようと思ったら、for~inでぐるぐる回すしかなさそうですね。
カウントする部分を関数化してしまうのは、イタダキです。
だいたい疑問点は解消できました。
ありがとうございました!