用于循环而不是while循环

阅读jQuery源代码我偶然发现了下面这段代码(可以在这里find ):

for (; i < length;) { if (callback.apply(object[i++], args) === false) { break; } } 

为什么在这里使用for循环而不是while循环?

我投票赞成有坏的编码风格的人。 这是唯一的解释,我可以看到for循环和i++被放置在一个数组下标。 我认为这会更好:

 while (i < length && callback.apply(object[i], args)) { i++; } 

或者,如果您碰巧认为原始示例中的===运算符具有值,则:

 while (i < length && callback.apply(object[i], args) !== false) { i++; } 

另一个可能的原因可能是性能优化。 虽然我把这个快速的基准放在一起似乎反驳了这个理论。 在Windows上, while循环比Chrome中的原始for循环快20%,在IE和Firefox中,两个循环执行相同的操作。 在OS X上, for循环在Firefox中占有10%的优势,两者在Chrome中没有区别,Safari比较喜欢while循环6%。

所以从性能的angular度来看,这是一个洗牌。 如果有的话,根据市场份额来判断,在Mac上针对Firefox进行优化之前,您可能需要针对Windows优化Chrome,在这种情况下, while循环将是首选。

对我来说,性能优化不太可能是这个代码的一个因素。 我回到我原来的理论,这只是一个糟糕的编码风格,使其超过代码审查过程的例子。

可能是因为它是从一个for (x in obj)循环中“重构”: http : //james.padolsey.com/jquery/#v=1.3.2&fn=jQuery.each

这是引入这种古怪的承诺 。

提交消息:

jquery核心:代码减less$.each$.curCSS

从差异中剔除:

 - for ( var i = 0, length = object.length; i < length; i++ ) - if ( callback.apply( object[ i ], args ) === false ) + for ( ; i < length; ) + if ( callback.apply( object[ i++ ], args ) === false ) 

看起来,作者只是错过了一段while改变的机会。

首先,在while循环中使用for循环没有任何长度的代价,但是您可以使用for循环获得额外的function,所以一些编程人员总是使用for

 for(;<condition>;){} while(<condition>){} 

这就是说,我认为这里的目的可能是为了与周围的代码保持一致。

例如,这里是原始代码的一部分。 正如你所看到的,在这段代码中,你可以一直保持“for”循环模式,所以感觉更一致:

 if (args) { if (isObj) { for (name in object) { if (callback.apply(object[name], args) === false) { break; } } } else { for (; i < length;) { if (callback.apply(object[i++], args) === false) { break; } } } } 

比较一下这个replace第二个循环。 当你阅读这个代码时,你必须从“for”循环模式转换到“while”循环模式。 现在我不了解你,但是我发现在上面的循环条件之间切换,而不是在下面的循环条件下,我的眼睛稍微快一点。 这是因为在上述情况下,我可以把注意力集中在条件上,而在下面的情况下,我的眼睛被重新读取, while每一次,因为它们是不同的:

 if (args) { if (isObj) { for (name in object) { if (callback.apply(object[name], args) === false) { break; } } } else { while (i < length) { if (callback.apply(object[i++], args) === false) { break; } } } } 

我发现,当我重写东西或者多个人碰到一段代码时,会发生这样的事情。 看不出有什么特别的原因。

我希望得到正确的初始化此块以上。

最简单也是最诚实的答案是“短暂的”。 这样做绝对没有实际的理由,我们没有从这样的2微笑循环中获利。

至于上述的原因,比如:

  • 重构 – 这是最可能的,但这不是一个借口。
  • 小型化的考虑 – 这是less,less可能。
  • 心理/可读性/代码支持问题 – 我非常怀疑有人编写这样的代码,牢记用户可能会因为代码构造和松散集中而感到困惑;

好吧,至于这些原因 – 所有这些都绝对值得一提,但说实话,jQuery代码风格并不理想。 有时候会有原因,有些时候,这只是一个事实问题。

生产代码并不总是最漂亮的代码。 阅读任何语言的生产就绪,硬核代码总是很好,但不是100%的代码风格。 说,vim是美丽的,非常强大的软件,但(对我来说)一些纯粹可以惊讶于它的源代码。 虽然循环的东西是可以的))))

所以t至less运行一次,因为如果你使用while循环,如果逻辑是假的,它不会运行。 即使它是假的,它也会运行至less一次。