看一下这段代码:
for (var i = 0, f; f = families[i]; i++) {
}
我之前没有真正看到这样的循环,我想确保我理解正确。
假设families.length == 2
for
行的第二部分在f = families[2]
上返回false,我是否正确?
我原本以为它需要像f == families[2]
这样才能返回false。
答案 0 :(得分:11)
f = families[i]
是一个返回families[i]
值的表达式。 (它还具有将该值分配给f
)
如果families.length === 2
然后families[2] === undefined
,则表达式返回undefined
,这是假的并且会中断循环。
为了获得更多黑客的乐趣,您可以转向
for (var i = 0, f; f = families[i]; i++) {
// body
}
到
for (var i = 0, f; f = families[i++]; /* body */);
您可能需要将;
替换为,
,将i
替换为i-1
。你也只是谋杀了可读性。
还应该指出for循环对于可读性来说是愚蠢的。
Object.keys(families).forEach(function(key) {
var family = families[key];
/* body */
});
明显更具可读性。
答案 1 :(得分:0)
这看起来像是一种愚蠢的做法
for(var i in families) {
if (families.hasOwnProperty(i)) {
// do whatever you want with families[i]
console.log(families[i]);
}
}