元のコメントをより完全な回答に変換します。
.length
go from0
および upでカウントされる配列インデックス。負のインデックスは、配列値ではなく、オブジェクトのプロパティと見なされます。以下の ECMAScript 仕様からわかるように、配列インデックスは基本的に、特別な処理が施された特定のタイプのプロパティ値にすぎません。
ECMAScript 仕様のセクション 15.4 から:
15.4 配列オブジェクト
配列オブジェクトは、特定のクラスのプロパティ名を特別に扱います。ToString(ToUint32(P)) が P に等しく、ToUint32(P) が 2^32 に等しくない場合にのみ、プロパティ名 P (文字列値の形式) は配列インデックスです。プロパティ名が配列インデックスであるプロパティは、要素とも呼ばれます。すべての Array オブジェクトには、値が常に 2^32 未満の非負の整数である長さプロパティがあります。length プロパティの値は、名前が配列インデックスであるすべてのプロパティの名前より数値的に大きくなります。Array オブジェクトのプロパティが作成または変更されるたびに、この不変条件を維持するために必要に応じて他のプロパティが調整されます。具体的には、名前が配列インデックスであるプロパティが追加されるたびに、必要に応じて長さプロパティが変更され、その配列インデックスの数値よりも 1 つ大きくなります。長さプロパティが変更されるたびに、値が新しい長さ以上の配列インデックスである名前を持つすべてのプロパティが自動的に削除されます。この制約は、Array オブジェクトの独自のプロパティにのみ適用され、プロトタイプから継承される可能性のある長さまたは配列インデックス プロパティの影響を受けません。
また、for-in-loop で配列を「反復」しないでください。
for (var i in a1)
これは、すべての配列インデックスを含むすべての列挙可能なプロパティを繰り返しa1
ますが、他のプロパティを含めることもできます。for
配列要素のみをループで反復処理する場合は、別の形式を使用する必要があります。
for (var i = 0, len = a1.length; i < len; i++)
タイピングは少し増えますが、より安全です。
.forEach()
または、最新のブラウザーでは、メソッドを使用できます。