for
ループはiterate
、インクリメント/デクリメント中に行うことを目的としています。
// note that I'm making this big and ugly to show what's going on
var incrementor = 1, length = 10,
array = [ "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine", "ten" ];
for (; incrementor <= length; incrementor = incrementor + 1) {
console.log(incrementor); // 1,2,3,...,10
console.log( array[incrementor - 1] ); // "one", "two", "three", ..., "ten"
}
for ... in ...
ループはenumerate
、オブジェクトのプロパティを通過することを目的としています。
var object = { "key1" : "one", "key2" : "two", "key3" : "three" },
key = "";
for (key in object) {
console.log(key); // "key1", "key2", "key3"
console.log( object[key] ); // "one", "two", "three"
}
配列に使用する理由for
は、悪いブラウザでfor ... in ...
は、数値プロパティ(つまり、:)を含めることができるだけでなく、必要のkey=0, key=1,...
ないものを列挙することもできるためですkey=splice, key=length, key=unshift
。このコードをプロのサイトで実行している場合、特定のハードウェアで実行されているJSの特殊なバージョン、またはUnityやUnrealEditorのUnrealScriptなどのプログラムでスクリプト言語として実行されている場合はあまり良いことではありません。
onオブジェクトを使用しない理由は、iterator
通常、次のようなオブジェクトを作成しないためです。
var obj = { "0" : "zero", "1" : "one", "2" : "two" };
そして、あなたがそうしたとしても(例えば、jQueryはこのようなことをします)、列挙したい単語ベースのプロパティがあるかもしれませんが、数えているので、それはできません。
また、注意することが重要enumerating
ですfor ... in ...
。withはその機能が標準化されていません。これが意味するのは、期待した順序で値を吐き出すことが100%保証されていないということです。ループの進行に依存している場合0,1,2,3,...
、for ... in ...
ブラウザの100%がそのように動作することを保証することはできません。 、100%の時間-ほとんどのブラウザがほとんどの場合それを正しく理解しているとしても。
ほとんどの場合、現在、先入れ先出しのルールに従っています。のようにオブジェクトを作成すると{ one : 1, two : 2, three : 3 }
、最新のブラウザはすべてを印刷します1,2,3
。次のようにオブジェクトを作成すると、次のよう{ two: 2, one: 1, six: 6 }
になります2,1,6
。
しかし、それは「すべき」時間の95%であり、「そうする」時間の100%ではありません。