2011-09-17 48 views
6

望着這一段代碼:Javascript與循環對象而不是計數器?

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

我還沒有真正見過像這樣的循環,我想確保我的理解是正確。
我正確的假設,如果families.length == 2for行的第二部分將返回false在f = families[2]

我原以爲它會需要像f == families[2]這樣的東西才能返回false。

+1

我好奇的一個愚蠢的辦法,我認爲循環不會停止,直到特定條件得到滿足,而不是什麼時候你處理所有條目。 – leopic

回答

11

f = families[i]是一個表達式,返回值爲families[i]。 (它也有分配該值的給f副作用)

如果families.length === 2然後families[2] === undefined從而表達式返回undefined其是falsey並中斷該循環。

更多的黑客樂趣,你可以把

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

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

您可能需要串,和字符串替換;i-1取代i。你也只是謀殺了可讀性。

還應該指出的是for循環愚蠢的可讀性。

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

更具可讀性。

+2

*你也只是謀殺了可讀性*嘿嘿。在與鍵盤天文臺芥末上校。 –

+0

事實上,也是根據LEOPiC的評論,在數組中間的某個虛假值可能會導致循環中斷,而不一定是當你達到最後時...... – Funka

+0

@Funka從什麼時候開始是一個家庭'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

這種方法對我來說沒有意義。爲什麼使用這個與普通的循環?對我來說,我發佈的循環基本上是從正常的循環中取出一行,我會立即說出類似於'var family = families [i];' –

+0

這是不同的......家庭可能有屬性不是0 ..n,即使「擁有」。 – 2011-09-17 02:08:16