看这段代码:

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

我以前从未真正看到过这样的循环,我想确保自己理解正确。
我是否假设families.length == 2for行的第二部分在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 */
});

更具可读性。

10-05 20:17