JavaScriptは、配列の項目数を数えるのではなく、配列の最後のインデックスの数で配列の長さプロパティを計算するようです。例:
var testArray = ['a', 'b', 'c'];
console.log(testArray.length); //3
testArray[8] = 'i';
console.log(testArray.length); //9
通常、私はPush()を使用し、ブラケット表記を使用して配列に値を追加しませんが、これはちょっとした驚きでした。 Array.lengthに値を割り当てるこの実装には何らかの理由がありますか?私が思いつく唯一のことは、配列項目のカウントを回避するためのパフォーマンス最適化として最後のインデックスを使用することだけです。
配列の長さは、配列に含まれる要素の数です。これにより、これらの要素が有効なオブジェクトまたは値であるか、単に「未定義」であるかは問題ではありません。位置8に要素を追加すると、最初の3つの要素と新しい要素の間に5つの追加要素が自動的に生成されます。
for(var i = 0; i < testArray.length; i++){console.log(testArray[i]);}
(実際の実装に応じて、これらはメモリの実際のスペースを使用する場合としない場合があります)
「等間隔」であることは、(リストや辞書などの他のコンテナータイプと比較して)配列の定義です。
最後のインデックスは長さに基づいています。 (まだ)存在しないインデックスに値を割り当てるとき、JSが舞台裏で長さを設定しているだけかもしれません。つまり、あなたはあなたを読むことができました:
testArray[8] = 'h';
なので
SetLength(testArray, 9); // or something similar (I'm not too familiar with JS)
testArray[8] = 'h';
他の開始インデックスを持つ配列を可能にするいくつかの言語がありますが、動的な割り当て/サイズ設定を可能にするほとんどの配列には、ゼロベースのインデックスがあります。つまり、配列の長さと最後のインデックス番号の間には、常に一定の関係があります。
Last index number = Length - 1
更新
JSはカウントを取得するためにlast index + 1
を実行しません。 testArray[8] = 'h';
を実行すると、JSは長さを8 + 1
に設定するだけではありません。最初に、配列にすでに存在する要素の数を確認します。配列に、インデックス8に何かを格納するのに十分な要素がない場合、サイズが変更されます。配列のサイズは、インデックス8で何かを保持するのに十分な大きさにサイズ変更されます。これは、配列がゼロベースであるため、8 + 1にサイズ変更することを意味します。
これは、配列が9つの要素を保持するという意味ではありません。これは、アレイにそのための十分なスペースがあることを意味します。 testArray[8] = 'h';
だけで配列を作成する場合、基本的には、JSに9つの要素に十分なスペースを割り当て、インデックス8の要素に'h'
を格納するように指示しています。