4

私はJavascriptを学んでいます。学習の一環として、次のシナリオに出くわしました。a1.length(コードの最後の行)に201が表示されると予想されますが、101が表示されます。アイデアはありますか?

var a1 = new Array();

for (var i = -100; i<=100; i++)
 a1[i]  = i;

for (var i in a1)
{
    document.write(i + "=" + a1[i])
    document.write("<br>");
}

document.write(a1.length);
4

3 に答える 3

6

元のコメントをより完全な回答に変換します。

.lengthgo 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()または、最新のブラウザーでは、メソッドを使用できます。

于 2012-11-11T16:24:15.890 に答える
1

これは、Javascriptの配列がゼロベースであるためです。つまり、ゼロから始まり、まで続きますlength - 1

通常、forループは次のように小なり演算子でバインドされるように記述します。

for(i = 0; i < arr.length; i++) {
    // do something with arr[i]
}
于 2012-11-11T15:50:06.677 に答える
0

配列の長さは、最後の要素のインデックスに1を加えたものとして定義されます。配列は連続している必要はありません。これにより、奇妙な結果が生じる可能性があります。

var myArray = [];
myArray[-42] = 1
myArray[1000] = 2;
document.write(myArray.length); // 1001
于 2012-11-11T15:00:44.657 に答える