for-in
JavaScript でループを記述する正しい方法は何ですか? ここで紹介する 2 つの方法のいずれについても、ブラウザーは文句を言いません。まず、反復変数x
が明示的に宣言されているこのアプローチがあります。
for (var x in set) {
...
}
あるいは、より自然に読めるが、私には正しくないように見えるこのアプローチ:
for (x in set) {
...
}
for-in
JavaScript でループを記述する正しい方法は何ですか? ここで紹介する 2 つの方法のいずれについても、ブラウザーは文句を言いません。まず、反復変数x
が明示的に宣言されているこのアプローチがあります。
for (var x in set) {
...
}
あるいは、より自然に読めるが、私には正しくないように見えるこのアプローチ:
for (x in set) {
...
}
を使用するvar
と、変数のスコープが縮小されます。それ以外の場合、変数はvar
ステートメントを検索する最も近いクロージャーを検索します。が見つからない場合var
、それはグローバルです (厳格モードの場合using strict
、グローバル変数はエラーをスローします)。これにより、次のような問題が発生する可能性があります。
function f (){
for (i=0; i<5; i++);
}
var i = 2;
f ();
alert (i); //i == 5. i should be 2
var i
for ループに書き込むと、アラートが表示されます2
。
最初のバージョン:
for (var x in set) {
...
}
というローカル変数を宣言しますx
。2 番目のバージョン:
for (x in set) {
...
}
ではない。
x
がすでにローカル変数である場合 (つまり、現在のスコープ (つまり現在の関数) のどこかにvar x;
またはがある場合)、それらは同等になります。がまだローカル変数でないvar x = ...;
場合、2 番目を使用すると暗黙的にグローバル変数が宣言されます。次のコードを検討してください。x
x
var obj1 = {hey: 10, there: 15};
var obj2 = {heli: 99, copter: 10};
function loop1() {
for (x in obj1) alert(x);
}
function loop2() {
for (x in obj2) {
loop1();
alert(x);
}
}
loop2();
hey
これは, there
, heli
, ,hey
を警告すると予想するかもしれませんが、は 1 つの同じものであるため、, , there
, ,を警告します。あなたはそれをしたくない !ループで使用します。copter
x
hey
there
there
hey
there
there
var x
for
さらに言えば、for
ループがグローバル スコープ内にある (つまり、関数内にない) 場合、ローカル スコープ (x
を使用する場合、スコープは で宣言されますvar x
) はグローバル スコープと同じです (スコープx
は で暗黙的に宣言されます)。 x
var なしで使用する場合)、2 つのバージョンは同じになります。
var
, alwaysでローカル変数を宣言する必要があります。
また、「for ... in」ループは、それがやりたいことが確実でない限り使用しないでください。実数配列を反復処理する場合 (これはかなり一般的です)、常に数値インデックスを持つループを使用する必要があります。
for (var i = 0; i < array.length; ++i) {
var element = array[i];
// ...
}
「for ... in」を使用して単純な配列を反復すると、予期しない結果が生じる可能性があります。これは、ループが数値インデックスの属性以外の配列の属性を取得する可能性があるためです。
編集— ここ 2015 年では.forEach()
、配列を反復処理するために使用しても問題ありません。
array.forEach(function(arrayElement, index, array) {
// first parameter is an element of the array
// second parameter is the index of the element in the array
// third parameter is the array itself
...
});
この.forEach()
メソッドは、IE9 以降の Array プロトタイプに存在します。
実際、見出し内の宣言for
が気に入らない場合は、次のことができます。
var x;
for (x in set) {
...
}
この質問に対する他の回答で述べたように、まったく使用var
しないと、グローバルプロパティの割り当てなどの不要な副作用が発生します。
でループ変数を宣言するものを使用しますvar
。暗黙的に宣言された変数には、おそらく意図したものとは異なるスコープがあります。
を使用var
するのが最もクリーンな方法ですが、両方ともここで説明されているように機能します: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in
基本的に、を使用var
することで、新しい変数を確実に作成できます。そうしないと、以前に定義した変数を誤って使用する可能性があります。
var はパフォーマンス上の理由から良いと思います。
Javascript は、x が既に別の場所に存在するかどうかを確認するために、グローバル スコープ全体を調べません。
一般的な観点から、最初のバージョンはループのスコープ内に存在する必要があるインデックス用であり、他のバージョンはループのコンストラクターが呼び出されたスコープ内の任意の変数です。
for ループ内でループのインデックスを使用する予定で、次の行でこれが必要とされない場合は、"var" を使用して変数を宣言することをお勧めします。これにより、"x" が 0 で初期化されたループのインデックスであることを確認できます。もう1つは、このコンテキストで他の「x」変数が使用可能な場合、これはループのインデックスによって上書きされます-つまり、いくつかの論理エラーが発生します-.