用于循环而不是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一次。