2011-09-17 5 views
6

Javascript forループはカウンタではなくオブジェクトを使用しますか?コードのこの作品を見て

for (var i = 0, f; f = families[i]; i++) { 
} 

私は実際には前にこのようなループを見ていないと私はそれを正しく理解しておくことにしたいです。
families.length == 2の場合、for行の2番目の部分がf = families[2]でfalseを返すとすれば正しいですか?

falseを返すには、f == families[2]のようなものにする必要があると思います。

+1

を行うための愚かな道のようなもののように見える、私はループが一定の基準まで停止しないことを前提としていますが、すべてのエントリを処理していない正確にいつ、満たされています。 – leopic

答えて

11

f = families[i]は、families[i]の値を返す式です。従って発現がfalsey、ループを破壊undefinedを返し

families[2] === undefined次いでfamilies.length === 2場合(またfにその値を割り当てるの副作用を有しています)。

よりハッキングの楽しみのために、あなたはあなたがi-1iを交換,し、文字列で;を置き換える文字列に持っているかもしれ

for (var i = 0, f; f = families[i++]; /* body */); 

for (var i = 0, f; f = families[i]; i++) { 
    // body 
} 

を変えることができます。あなたはまた、読みやすさを殺しました。

forループは読みやすくするために愚かであることも指摘しておきます。

Object.keys(families).forEach(function(key) { 
    var family = families[key]; 
    /* body */ 
}); 

かなり読みやすくなっています。

+2

*あなたはまた読みやすさを殺しました。* Heh heh。キーボードを備えた天文台の大佐の大佐。 –

+0

確かに、LEOPiCのコメントごとに、配列の途中のどこかで虚偽の値がループを壊してしまう可能性もあります。最後にヒットしたときは必ずしもそうではありません。 – Funka

+0

@Funkaいつから 'family 'falsey;) – Raynos

0

これは私が興味をそそらだ

for(var i in families) { 
    if (families.hasOwnProperty(i)) { 
     // do whatever you want with families[i] 
     console.log(families[i]); 
    } 
} 
+0

'Object.keys'を使用してください – Raynos

+0

この方法は私には意味がありません。なぜこれを通常のforループと比べて使うのですか?私が投稿したループは、本質的に、 'var family = families [i];'のようなものを瞬時に言う通常のループから抜粋したものです。 –

+0

これは異なっています...ファミリは0でないプロパティを持つ可能性があります..n、たとえ "own"でも。 –

関連する問題