紹介する。
■一次元配列の場合。
・普通のfor文
定義有り→エラーが発生しない。
list=new Array();
for(i=0;i<list.length;i++){
    alert(list[i]);
}
定義なし→エラーが発生する。
エラー: 'list' は宣言されていません。
for(i=0;i<list.length;i++){
    alert(list[i]);
}
・for-in文
定義あり→エラーが発生しない。
list=new Array();
for(var item in list){
    alert(list[item]);
}
定義なし→エラーが発生する。
エラー: 'list' は宣言されていません。
for(var item in list){
    alert(list[item]);
} 
つまり、上記のように一次元配列においての挙動は同じである。
■多次元配列の場合
・普通のfor文
二次元目までの定義あり→エラーが発生しない。
list=new Array();
list["a"]=new Array();
for(i=0;i<list["a"].length;i++){
    alert(list["a"][i]);
} 
二次元目までの定義なし(一次元目のみ定義)→エラーが発生する。
エラー: 'list.a.length' は Null またはオブジェクトではありません。
list=new Array();
for(i=0;i<list["a"].length;i++){
    alert(list["a"][i]);
} 
・for-in文
二次元目までの定義あり→エラーが発生しない。
list=new Array();
list["a"]=new Array();
for(var item in list["a"]){
    alert(list["a"][item]);
}
二次元目までの定義なし(一次元目のみ定義)→エラーが発生しない。
list=new Array();
for(var item in list["a"]){
    alert(list["a"][item]);
}
つまり、for-in文で多次元配列を扱う場合は、2次元目の配列を定義していなくても
なぜかエラーが発生しない。
ちなみ三次元にしたところ、
以下のように一次元のみ定義だとエラーが発生。
エラー: 'list.a.b' は Null またはオブジェクトではありません。
list=new Array();
for(var item in list["a"]["b"]){
    alert(list[item]["a"]["b"][item]);
} 
二次元まで定義したらエラーが発生しなくなる。
list=new Array();
list["a"]=new Array();
for(var item in list["a"]["b"]){
    alert(list[item]["a"]["b"]);
}
■結論
①普通のfor文でx次元配列を扱う場合、x次元まで定義する必要がある。
②for-in文でx次元配列を扱う場合は、x-1次元まで定義すればよい。
※①はlengthを参照するのでx次元目まで定義していないとエラーが発生するのはかるが、
②でx次元目まで定義していないのにエラーが発生しない理由がわからない。
0 件のコメント:
コメントを投稿