私が取り組んでいる大きなプロジェクト(擬似コード)で次のループアノテーションを見つけました。
var someOtherArray = [];
for (var i = 0, n = array.length; i < n; i++) {
someOtherArray[i] = modifyObjetFromArray(array[i]);
}
私の注意を引いたのは、この余分な「n」変数です。このように書かれたfor lopを見たことはありません。
明らかにこのシナリオでは、このコードを次の方法で書くことができなかった理由はありません(私は非常に慣れています):
var someOtherArray = [];
for (var i = 0; i < array.length; i++) {
someOtherArray[i] = modifyObjetFromArray(array[i]);
}
しかし、それは私に考えさせられました。
そのようなforループを書くことが理にかなっているシナリオはありますか?「配列」の長さはforループの実行中に変わる可能性があるという考えが浮かびますが、元のサイズよりもさらにループしたくはありませんが、そのようなシナリオは想像できません。
OutOfBoundsExceptionが発生する可能性が高いため、ループ内で配列を縮小してもあまり意味がありません。
このアノテーションが役立つ既知のデザインパターンはありますか?
編集 @ Jerry101で述べたように、理由はパフォーマンスです。これが、私が作成したパフォーマンステストへのリンクです:http : //jsperf.com/ninforloop。私の意見では、非常に巨大な配列を繰り返し処理しているのでなければ、違いは十分に大きくありません。コピー元のコードは最大20個の要素しか持っていなかったため、この場合の読みやすさはパフォーマンスの考慮事項を上回ると思います。
n
よりも遅い場合がarray.Length
あります。これは、JITterが配列境界チェックを削除できることに気付かない場合があるためです。