看看这段代码:
for (var i = 0,f; f = families[i]; i++) { }
我之前没有真正看过这样的循环,我想确保我理解正确.
我是否正确假设如果families.length == 2,for行的第二部分将在f = families [2]上返回false?
我本以为它需要像f ==系列[2]才能返回false.
解决方法
f = families [i]是一个返回families [i]值的表达式. (它还具有将该值赋给f的副作用)
如果families.length === 2那么族[2] === undefined因此表达式返回undefined,这是假的并且打破了循环.
为了获得更多的黑客乐趣,你可以转向
for (var i = 0,f; f = families[i]; i++) { // body }
成
for (var i = 0,f; f = families[i++]; /* body */);
您可能需要更换字符串; with,和string用i-1替换i.你也只是谋杀了可读性.
还应该指出for循环对于可读性来说是愚蠢的.
Object.keys(families).forEach(function(key) { var family = families[key]; /* body */ });
显着性更强.