2013-07-05 23 views
9

Sadece gelişimi için Aptana Studio yüklemiş ve JavaScript için kullanılabilir komutların biri böyle bir for döngüsü yerleştirin olduğu için doğal geliştirilmiş:JavaScript döngü

for (var i=0; i < Things.length; i++) { 
    Things[i] 
}; 

Diğer bir seçenek ise takın böyle döngü için geliştirilmiş:

for (var i = Things.length - 1; i >= 0; i--){ 
    Things[i] 
}; 

Neden bu sonuncusu ilkinden daha iyidir?

+7

o uzunluk, tesisi her zaman erişilmesini gerektirmeyen çünkü. İkinci bölümde, 'for' başlatması sadece bir kez gerçekleştirilir. BTW, çoğu insan okunabilirlik için ilkini hala tercih ediyor. –

+1

[JavaScript - Ters döngüler gerçekten daha hızlı mı? ...] 'nın tam kopyasını (http://stackoverflow.com/questions/1340589/javascript-are-loops-really-faster-in-reverse) Lütfen öncelikle kendiniz arayın - ve bu soru "Related" kenar çubuğunda 1 numaraydı. – Bergi

+0

@ cPu1 Ya da dizilerini geriye doğru sıralamak istemedikleri için ... – totymedli

cevap

11
// ( A ) (  B  ) (C) 
for (var i=0; i < Things.length; i++) { 
    Things[i] 
}; 
  • bir yürütülür kez önce döngü başlar.
  • B her yineleme önce yeniden değerlendirilir ve doğru değilse, bu döngü çıkar (bu nedenle her bir yineleme Things uzunluğu özelliği denetler.)
  • yürütülür sonraki her döngü değiştirmesini olsun performans az olduğunu ve okunabilirliği kısmını feda riske, yani en okunabilir bulmak ne sopa dedi yineleme

- en doğru performanc değil neyi E-bilge.


Bu senin için daha mantıklı olabilir:

for (var i=0; i < Things.length; i++) { 
    Things[i] = null; 
}; 

şekilde tekrar yazılabilir şunlardır:

var i = 0; //A 
while (true) { 
    if (!(i < Things.length)) { //B - We check the length all the time 
     break; 
    } 
    Things[i] = null; 
    i++; //C 
} 

ve

for (var i = Things.length - 1; i >= 0; i--){ 
    Things[i] = null; 
}; 

aşağıdaki şekilde tekrar yazılabilir :

var i = Things.length - 1; //A - We only check the length once 
while (true) { 
    if (!(i >= 0)) { //B 
     break; 
    } 
    Things[i] = null; 
    i--; //C 
} 
+2

* 'while (true) {if (! X) mola;…' * ??? Sadece '(X) {… ' – Bergi

+0

@Bergi Agreed -' i kullanın ve bu örnek kodun oluşturulması sırasında düşünülmüştür, ancak bunun ne olduğuna dair bir vitrin daha vardır ve ben şahsi olarak bu tam durumda olduğuna inanıyorum (ne yaptığını göstererek), bir koşulu ve bir 'break' ifadesini kullanarak göstermek daha mantıklı. – h2ooooooo

+0

Aynı döngüyü yazmanın farklı yollarını göstermeyi seviyorum :-) – Rikki

4

Çünkü Things.length sonucu her seferinde değerlendirilmiyor (her yinelemede). Sadece bir kez başlangıçta atanmış ve bu noktadan itibaren kullanılmıştır. Bunun dışında iterasyonların sayısı açıkça aynı.

Gerçekten bir mikro optimizasyon. Kodunuzda optimizasyon yapmak için daha ilginç şeyler bulacaksınız.

+1

Bu cevap 'accept' olmalıdır! –

1

Sanırım ikinci saniyede Things.length'a (i'u başlatırken) ilk kez eriştiğinizde, orada olup olmadığınızı kontrol etmek için her seferinde erişebilirsiniz.

4

Bu nasıl?

for (var i = 0, len = things.length; i < len; i += 1) { 
    // something 
} 

Güncelleme:

Maalesef, İngilizce annem dili değil. Seninle konuşmayı nasıl başlatacağımı bilmiyorum. Her neyse, burada Youtube URL’si ve bu videodan öğrendim. Umarım bu sana yardımcı olur. Nedenini açıklıyor!

https://www.youtube.com/watch?v=mHtdZgou0qU

+1

Cevabınız yardımcı olabilse de, en azından nedenini açıklamalısınız. Olduğu gibi, cevabınız Düşük Kalite Mesajları denetleme kuyruğuna aktarıldı (bunu görüntülüyorum) Bir yanıt eklemek için cevabınızı düzenlemenizi öneririm. –

+0

@ChrisSpittles Tamam, gönderiyi güncelledim. Teşekkür ederim. –

+0

Hah, ilginç ... – Fahmi