注: JavaScript の配列は連想配列ではありません。 JavaScript には、キーと値の対応を管理するオブジェクトのみがあります。ただし、連想配列は順序を維持しますが、オブジェクトは順序を維持しません。
for in ループはプロトタイプ チェーン上のすべてのプロパティを列挙するため、これらのプロパティをフィルタリングする唯一の方法は `hasOwnProperty` 関数を使用することなので、通常の for ループよりも何倍も遅くなります。
反復
配列の走査で最高のパフォーマンスを達成するには、従来の for ループを使用することをお勧めします。
var list = [1, 2, 3 , 4, 5, ... 100000000];
for(var i = 0, l = list.length; i console.log(list[i]); >}
上記のコードには、l = list.length によって配列の長さをキャッシュする処理があります。
長さは配列のプロパティですが、各ループで長さにアクセスするとパフォーマンスのオーバーヘッドが発生します。 最新の JavaScript エンジンがこれを最適化している可能性がありますが、コードがこれらの最新のエンジンで実行されるかどうかは保証できません。
実際、配列の長さをキャッシュしない方法は、キャッシュされたバージョンよりもはるかに遅くなります。
`length` プロパティ (`length` プロパティ)
length プロパティの getter メソッドは単純に配列の長さを返しますが、setter メソッドは配列を切り詰めます。
var foo = [1, 2, 3 , 4, 5, 6];
foo.length = 3; // [1, 2, 3]
foo; // [1, 2, 3]
翻訳者注: この時点で Firebug で foo の値を表示すると、 [1, 2, 3, unfined, undefined, unknown] になりますが、この結果は正確ではありませんChrome のコンソールで foo の結果を確認すると、次のようになることがわかります。 [1, 2, 3] 変数は JavaScript の変数であるため、変数の意味は異なります。上の 2 つの結果はまったく異なります。
// 翻訳者注: 確認するには、次のコードを実行して、シリアル番号 5 が foo に存在するかどうかを確認してみましょう。
5 in foo; // Firebug または Chrome のどちらでも false を返します。
foo[5] = unknown;
5 in foo; // Firebug または Chrome の場合、
は長さ A に設定されます。値を小さくすると配列が切り詰められますが、length プロパティを増やしても配列には影響しません。
結論 (結論として)
パフォーマンスを向上させるには、通常の for ループを使用し、配列の長さプロパティをキャッシュすることをお勧めします。 for in を使用して配列を反復処理することは、悪いコーディング方法とみなされ、エラーが発生し、パフォーマンスの問題が発生する傾向があります。
配列コンストラクター
配列のコンストラクターは引数の処理方法が少し曖昧であるため、配列の作成には配列のリテラル構文 [] を使用することを常にお勧めします。
[1, 2, 3]; // 結果: [1, 2, 3]
new Array(1, 2, 3); // 結果: [1, 2, 3]
[3]; // 結果: [3]
new Array(3) // 結果: []
new Array('3') // 結果: ['3']
翻訳者注: ここでの曖昧さは、配列の 2 つのコンストラクター構文を指します。 var arr1 = new Array(arrayLength); var arr2 = new Array(element0, element1, ..., elementN); / 翻訳者注: したがって、次のコードは非常に混乱するでしょう
new Array(3, 4, 5) // 結果: [3, 4, 5]
new Array(3) // 結果: [] 、この配列の長さは 3 です。
コンストラクターに渡されるパラメーターは 1 つだけであり (翻訳者注: new Array(3) の呼び出しメソッドを指します;)、このパラメーターは数値であるため、コンストラクターは空の値を返します。このパラメータに設定された長さプロパティを持つ配列。この時点では長さプロパティのみが設定され、実際の配列は生成されないことに注意することが重要です。翻訳者注: Firebug では [未定義、未定義、未定義] と表示されますが、これは実際には間違っています。前のセクションに詳細な分析があります。
var arr = new Array(3);
arr[1]; // 未定義
1 in arr; // 配列はまだ生成されていません
これが優先されます配列の設定よりも長さの属性は、for ループの問題を避けるために文字列をループする必要がある場合など、いくつかの状況でのみ役立ちます。
new Array(count 1).join(stringToRepeat);
// 翻訳者注: new Array(3).join('#') は "##" を返します
結論 (In結論)
新しい配列を作成するために配列コンストラクターを使用することは避けるべきです。配列のリテラル構文を使用することをお勧めします。これらはより短く、より簡潔であるため、コードの可読性が向上します。
for in ループ
in 演算子と同様に、for in ループもオブジェクトのプロパティを検索するときにプロトタイプ チェーン上のすべてのプロパティを走査します。
注: for in ループは、配列の length プロパティなど、enumerable が false に設定されているプロパティを反復しません。
コードをコピー