2013-07-05 14 views
9

nativen verbessert habe ich gerade installiert Aptana Studio für die Entwicklung und eine der verfügbaren Befehle für Javascript ist ein Einsatz für Schleife wie folgt aus:Javascript for-Schleife

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

Eine weitere Option ist Insert for-Schleife wie folgt verbessert:

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

Warum ist dieser letzte besser als der erste?

+7

Weil es erfordert nicht die Länge Eigenschaft jedes Mal zugreifen. Im letzten Teil wird die Initialisierung nur einmal durchgeführt. Übrigens würden die meisten Leute die erste für die Lesbarkeit bevorzugen. –

+1

exaktes Duplikat von [JavaScript - Sind Schleifen wirklich schneller umgekehrt?] (Http://stackoverflow.com/questions/1340589/javascript-are-loops-really-faster-in-reverse) Bitte suchen Sie zuerst selbst - und diese Frage war # 1 in der "Related" -Seitenleiste – Bergi

+0

@ cPu1 Oder einfach weil sie ihr Array nicht rückwärts durchlaufen wollen ... – totymedli

Antwort

11
// ( A ) (  B  ) (C) 
for (var i=0; i < Things.length; i++) { 
    Things[i] 
}; 
  • A wird einmal ausgeführt, bevor die Schleife beginnt.
  • B wird neu bewertet vor jeder Iteration, und wenn es nicht wahr ist, verlässt es die Schleife (daher überprüft er die Länge Eigenschaft Things auf jeder einzelnen Iteration.)
  • C ausgeführt jedes Mal nach Iteration

das heißt, die Leistung, die Sie von Änderung der Schleife erhalten, ist minimal, und Sie riskieren Teil der Lesbarkeit zu opfern, so mit dem, was Sie finden die meisten lesbar - nicht das, was die meisten richtig performanc e-weise.


Dies könnte mehr Sinn für Sie machen:

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

könnte als die neu geschrieben werden folgende:

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

und

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

könnte wie folgt neu geschrieben werden :

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 (wahr) {if (! X) break; ...' * ??? Verwenden Sie einfach 'while (X) {...' – Bergi

+0

@Bergi Einverstanden - und es wurde während der Erstellung dieses Beispiels Code gedacht, aber dies ist eher ein Schaufenster dessen, was passiert, und ich persönlich glaube, dass in diesem exakten Fall (z zeigen, was es tut), es macht mehr Sinn, es zu zeigen, indem man eine Bedingung und eine 'Bruch'aussage verwendet. – h2ooooooo

+0

Ich liebe die Demonstration der verschiedenen Möglichkeiten, die gleiche Schleife zu schreiben :-) – Rikki

4

Da das Ergebnis von Things.length nicht jedes Mal (bei jeder Iteration) ausgewertet wird. Es wird nur einmal am Anfang zugewiesen und ab diesem Zeitpunkt verwendet. Ansonsten ist die Anzahl der Iterationen offensichtlich gleich.

Es ist eine Mikro-Optimierung wirklich. Sie werden mehr interessante Dinge finden, um in Ihrem Code zu optimieren, nehme ich an.

+1

Diese Antwort muss "akzeptiert" sein! –

1

Ich vermute, dass auf der zweiten Sie nur Zugriff auf Things.length einmal (bei der Initialisierung i) wo auf der ersten Sie jedes Mal zugreifen, um zu überprüfen, ob Sie da sind.

4

Wie wäre es damit?

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

Update:

Sorry, Englisch ist nicht meine Muttersprache. Also habe ich keine Ahnung, wie ich mit euch das Gespräch beginnen soll. Wie auch immer, hier ist Youtube URL und ich habe von diesem Video gelernt. Ich hoffe das hilft dir. Es erklärt warum!

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

+1

Obwohl Ihre Antwort helfen könnte, sollten Sie zumindest erklären, warum. So wie es ist, wurde Ihre Antwort in die Moderationswarteschlange für minderwertige Posts (wo ich sie gerade ansehe) weitergeleitet. Ich schlage vor, dass Sie Ihre Antwort bearbeiten, um eine Erklärung hinzuzufügen. –

+0

@ChrisSpittles Ok, ich habe den Beitrag aktualisiert. Vielen Dank. –

+0

Hah, interessant ... – Fahmi

Verwandte Themen