2011-08-14 15 views
7

我最近有機會做JavaScript循環,我很困惑是否使用循環或while語句。什麼是更有效的Javascript:while或for語句?

var i = foo.length; 
while(i--){ 

} 

for(var i=0 ;i<=foo.length;i++){ 

} 

我想從JavaScript傢伙知道哪一個更effecient使用下,我們應該相應地使用他們什麼情況。是否與java中的原因相同或有所不同?

+0

我不知道,一個會比其他的更有效,因爲每個涉及相同數量的分配和比較。爲了可讀性,我會去'for'循環,但這是個人偏好。 – Ryan

+7

你可以在http://jsperf.com/for-vs-while-loop-iterating上自己試試。 – pimvdb

+0

這不是一個效率問題,這是一個偏好和可讀性的問題。 @ pimvdb的測試顯示沒有實際區別。 – JJJ

回答

9

理論上while循環更快,因爲for循環查找雖然循環每次length屬性的foo,但在現實世界中使用它會作出不可估量的小的差異。

+0

這是真的(i = foo.length; i> 0; i--)在每次迭代中都不會查找foo的長度屬性,但無論如何這是O(1)操作 – guigouz

4

For-loops是while循環的語法糖。他們應該完全一樣。

但是,您的兩個循環在語義上是不同的。一個計數到零,另一個計數到一個對象的屬性,這肯定會變慢,儘管只是略微如此。這將是更有意義的比較上面,而環與環以下:

for (var i = foo.length; i--;) { } 
4

其實它有您所使用的循環中沒有顯著差異。我讀過的每本書都這麼說。您的示例中可能存在差異,因爲您在while循環中使用遞減循環。它往往會更快,因爲只評估一個條件。

e.g while(i<100)慢於while(i--)

你的for循環,你可以存儲環路和工作該值前的長度,而不是每次取回的。它也會給你一些性能優化。

var fooLength = foo.length; 
for(var i=0 ;i<= fooLength;i++){ 

} 
+0

你甚至可以在for()的第一部分做到這一點。 for(var i = 0,arrLength = arr.length; i

7

在一些瀏覽器中循環的某些方面會更快 - 例如,在Chrome中,for循環超過兩倍的速度,但在所有瀏覽器沒有一致的贏家。如果你發現在一個瀏覽器中使其真正快速的技巧,你將在另一個瀏覽器中受到懲罰。在不同的瀏覽器

實際性能測試:http://jsperf.com/for-or-while

您應該使用有意義的局面環的類型。在許多情況下,你在循環內做的事情比循環本身要長得多。

0

它們的「效率」或性能沒有太大差別,可以根據具體情況使用程序的邏輯更容易理解。