配列のforループを次のようにコーディングする必要がある特別な理由はありますか?for (var i = 0; i < foo.length; i++) {
オブジェクトのループは、オブジェクトfor (var i in foo) {
の設定方法と配列の設定方法によるものですか?(配列はオブジェクトの一種であることを私は知っています)または単なる別の厄介なプログラミング規約。
2 に答える
リストは整数でインデックス可能であるため、リストfor(i=0; i<n; i++)
を反復するときはループを使用する必要があります。
arr = [1,2,3,4]; // arr[0] == 1; arr[1] == 2;
for(var i=0; i<arr.length; i++) { alert(arr[i]; } // 1, 2, 3, 4
オブジェクトはキーで索引付けできるため、オブジェクトfor...in
を反復するときはループを使用する必要があります。オブジェクトをkey:value マップと考える場合。オブジェクトが各 keyに一致する独自のプロパティを持っているかどうかを確認することを忘れないでください。ステートメントはオブジェクトのproptotype チェーンをチェックし、上から継承されたプロパティ名を返すためです。in
obj = {
foo: 1,
bar: 2
}
for(key in obj) {
if(obj.hasOwnProperty(key)) {
alert(key); // foo, bar
alert(obj[key]); // 1, 2
}
}
主な理由は、for...in
定義されたメンバーのみを反復処理するためです。
そう、
var arr = [];
arr[10] = "hi";
for(var x in arr)
{
alert(x);
}
定義されている1 つの値のみが表示されます。これは良いこともありますが、通常はそうではありません。
また、for...in
配列インデックスではなく、プロパティをループします (javascript では、配列は、名前が配列に割り当てる値であるプロパティを持つ単なる通常のオブジェクトです)。
したがって、 for..in を使用すると、次のような奇妙な結果が得られます。
1
2
3
長さ
等
典型的なfor
構文を使用することは、配列のより良いオプションです。オブジェクトではfor...in
、未定義の問題がそれほど頻繁に発生しないため、より理にかなっています。いずれにせよ、私はfor(var x; x < y; x++)
構文を使用するのが好きです。jsの方がいい感じです。