JavaScriptでは、私は最近、逆ループがより高速である方法を見つけました。私はこのフォームでそれらを見てきました逆のwhileループはJavaScriptでいつ停止するのかを知っていますか?
は:
var i = someArray.length;
while (i--) {
console.log(someArray[i]);
}
私はこれをテストし、それが全体の配列を経て一旦停止しました。
アレイの完成後にいつ停止するかはどのようにわかりますか?
JavaScriptでは、私は最近、逆ループがより高速である方法を見つけました。私はこのフォームでそれらを見てきました逆のwhileループはJavaScriptでいつ停止するのかを知っていますか?
は:
var i = someArray.length;
while (i--) {
console.log(someArray[i]);
}
私はこれをテストし、それが全体の配列を経て一旦停止しました。
アレイの完成後にいつ停止するかはどのようにわかりますか?
whileループは、ループのたびにカッコ内の式を評価します。その式が偽の値になると、ループは停止します。 falsey値の
例は:
false
0
undefined
NaN
null
""
この場合i
の値はループをするたびに減分され、それは0
の値に達したとき、ループが停止します。これは後置減分演算子であるため、減算の前に式の値がチェックされます。つまり、内部ループは、someArray.length - 1
〜0
(両端を含む)の値が、その配列のすべてのインデックスであるi
を参照します。
あなたのコード例:
var i = someArray.length;
while (i--) {
console.log(someArray[i]);
}
は、これと同じ出力を作成します。
for (var i = someArray.length - 1; i >= 0; i--) {
console.log(someArray[i]);
}
i--
が0になると、ループが停止します。
while (...)
の式がfalseに評価されると、ループが停止します。
i
は正の数(長さ)で減少しているため、ある時点でゼロになります。
ブール値のコンテキストでは、ゼロはfalse
に変換され、ループがある時点で停止することを保証します。
i--
は、前回の減算値を返しますので、ループが停止すると、実際にはi
が-1
になります。
「0は偽と等しい」と言うのは間違いですが、0は偽と評価する方が良いと言えます。 – vascowhite
厳密に言うと、ゼロはブール値のコンテキストには存在しません。起こっているのは、[抽象的な 'ToBoolean'関数(http://es5.github.com/#x9)です。2)は '0'を' false'に変換します。 – pimvdb
彼が言ったこと:) – vascowhite
ループが実行されるたびに、i--
がチェックされています。 --
は、JavaScriptにi
を1減らすよう指示します。最終的にi
は0になります。これはfalse
に相当します。この時点で、ループは停止します。
暗闇の中で刺すと、0はブール式で偽と評価されるためです。 0 == trueはfalseを返します 0 == falseはtrueを返します
-1で始めると、無限にループします。
「真実性」が何であるかを知りたい場合は、[記事](http://www.sitepoint.com/javascript-truthy-falsy/)を参照してください。 – OnesimusUnbound
@OnesimusUnboundええ、その記事は、ありがとう! – Jacob