要するに
まず第一に、あなたの主張はすべて正しいです。
- 最初のループは、突然 (ブレーク、リターン、スローなどで) 終了するまで実行されます。
- 2 番目のループは、突然終了するまで実行されますが、変数の割り当ても実行され、値がインクリメントされます。
- 3 番目の for ループは、中央の条件が偽になるまで、通常の for ループのように実行されます。その体は空です。
しかし、なぜ JavaScript はこれを行うのでしょうか?
なぜこれが起こるのかを掘り下げてみましょう。
言語仕様を詳しく見てみると、次のことが for ループで発生することがわかります。
IterationStatement : for ( ExpressionNoIn(opt) ; Expression(opt) ; Expression(opt)) ステートメント
残りの回答では、これらのステートメントとその定義を扱います。
それでは、ケースを見てみましょう。
次のいずれfor(;;)
かが発生した場合:
ExpressionNoIn が存在しないため、その節に対しては何も呼び出されません (節 1 に記載されているとおり)。
2 番目の式は in ではないため、コールは返されません (第 3 節で述べられているように)。
3 番目の式は空であるため、「インクリメント」は実行されません (3.f 節で述べているように)。
したがって、基本的には、予測どおりに無限に繰り返されます( abreak
またはから返される、またはからスローされるまで、および一般的に突然の完了を引き起こすものまで)。(節eとdが教えてくれるように)。
2 番目のケースfor (var i = 0; ; ++i)
では、次のことが起こります。
ExpressionNoIn が存在するので、それを評価し、get value で割り当てます (1 節で述べているように)。私たちはそれを割り当てません。
次に、2 番目の式がここにないため、無限に繰り返します。したがって、突然の実行が発生するか、ブレークが発生するまで続行します。具体的には、ここで定義されています。
i
節 f が示すように、繰り返しごとにインクリメントします。
3 番目のケースfor (var p; p; p = someValue) /* empty body */ ;
では、次のことが起こります。
これは for ループとして評価されます。ステートメントは確かに空ですが、for ループはあまり気にしません。唯一の違いは、for ループから値が返されないことです。基本的に、これは完全で正当な for ループです。;
は単なる空のステートメントです。実際のループに内容のない for ループを実行したい場合に便利です。これは、機能検出で時々見られます。これは、... などの最小値を見つけたい場合にも役立ちn
ます。
値が falsey になるまで、またはより正確に呼び出すToBoolean
と が生成さ false
れるまで実行されるという点で、あなたは正しいです。条項 3.a.ii が指定するとおり。
ご覧のとおり、これはすべて仕様にあり、明確に定義されています:)
コーダーはなぜこれを行うのですか?
最初のスニペットでは、break
節を使用してフロー制御を実行します。if (eol >= pos || eol < 0) break;
(彼らは行末をチェックします。これは、より一般的な for ループで行うことができます)。
2 番目のスニペットでも、break を使用してフロー制御を行っています。
if (!definitions.hasOwnProperty(uniq)) { name = uniq; break; }
彼らは再び for ループ内の break ステートメントに入れました。
3 番目のスニペットは文脈から外れていますが、(些細な例で) 10 より大きい最初の数値 (または 10 番目の div 要素、または文字列の出現 - おわかりのように) を見つけたいとしましょう。できること:
for(var i=0;i<=10;i++);
10 より大きい最初の数を取得します。