看这段代码:
for (var i = 0, f; f = families[i]; i++) {
}
我以前从未真正看到过这样的循环,我想确保自己理解正确。
我是否假设
families.length == 2
的for
行的第二部分在f = families[2]
上返回false是正确的吗?我本来以为返回false需要像
f == families[2]
这样的东西。 最佳答案
f = families[i]
是一个返回families[i]
值的表达式。 (将值分配给f
也有副作用)
如果是families.length === 2
,则为families[2] === undefined
,因此表达式返回false的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 */
});
更具可读性。