望着這一段代碼:Javascript與循環對象而不是計數器?
for (var i = 0, f; f = families[i]; i++) {
}
我還沒有真正見過像這樣的循環,我想確保我的理解是正確。
我正確的假設,如果families.length == 2
for
行的第二部分將返回false在f = families[2]
?
我原以爲它會需要像f == families[2]
這樣的東西才能返回false。
望着這一段代碼:Javascript與循環對象而不是計數器?
for (var i = 0, f; f = families[i]; i++) {
}
我還沒有真正見過像這樣的循環,我想確保我的理解是正確。
我正確的假設,如果families.length == 2
for
行的第二部分將返回false在f = families[2]
?
我原以爲它會需要像f == families[2]
這樣的東西才能返回false。
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 */
});
更具可讀性。
這看起來像那種做
for(var i in families) {
if (families.hasOwnProperty(i)) {
// do whatever you want with families[i]
console.log(families[i]);
}
}
使用'Object.keys' – Raynos
這種方法對我來說沒有意義。爲什麼使用這個與普通的循環?對我來說,我發佈的循環基本上是從正常的循環中取出一行,我會立即說出類似於'var family = families [i];' –
這是不同的......家庭可能有屬性不是0 ..n,即使「擁有」。 – 2011-09-17 02:08:16
我好奇的一個愚蠢的辦法,我認爲循環不會停止,直到特定條件得到滿足,而不是什麼時候你處理所有條目。 – leopic