zum
for
Schleifen sind viel effizienter. Es ist ein Schleifenkonstrukt spezifisch zu iterieren ausgelegt , während eine Bedingung ist wahr , die gleichzeitig einen Schrittmechanismus bietet ( im Allgemeinen den Iterator zu erhöhen). Beispiel:
for (var i=0, n=arr.length; i < n; ++i ) {
...
}
Dies soll nicht bedeuten , dass for- Schleifen immer effizienter sind, nur dass JS-Engines und Browser sie so optimiert haben. Im Laufe der Jahre gab es Kompromisse, welches Schleifenkonstrukt effizienter ist (z. B. für, während, reduzieren, umkehren usw.) - verschiedene Browser und JS-Engines haben ihre eigenen Implementierungen, die unterschiedliche Methoden bieten, um dieselben Ergebnisse zu erzielen. Wenn Browser weiter optimiert werden, um die Leistungsanforderungen zu erfüllen, [].forEach
könnten sie theoretisch so implementiert werden, dass sie schneller oder vergleichbar mit a sind for
.
Leistungen:
- effizient
- vorzeitige Beendigung der Schleife (Ehrungen
break
und continue
)
- Bedingungskontrolle (
i<n
kann alles sein und ist nicht an die Größe eines Arrays gebunden)
- variabler Umfang (
var i
Blätter i
verfügbar, nachdem die Schleife endet)
für jedes
.forEach
sind Methoden, die hauptsächlich über Arrays iterieren (auch über andere Aufzählungen wie z. B. Map
und Set
Objekte). Sie sind neuer und bieten Code, der subjektiv leichter zu lesen ist. Beispiel:
[].forEach((val, index)=>{
...
});
Leistungen:
- beinhaltet keine Variableneinrichtung (iteriert über jedes Element des Arrays)
- Funktionen / Pfeilfunktionen erweitern die Variable auf den Block
Im obigen Beispiel val
wäre dies ein Parameter der neu erstellten Funktion. Daher würden alle Variablen, die val
vor der Schleife aufgerufen werden , ihre Werte nach deren Ende beibehalten.
- subjektiv wartbarer, da es möglicherweise einfacher ist zu identifizieren, was der Code tut - er iteriert über eine Aufzählung; Eine for-Schleife könnte für eine beliebige Anzahl von Schleifenschemata verwendet werden
Performance
Leistung ist ein heikles Thema, das im Allgemeinen einige Erfahrung erfordert, wenn es um Voraussicht oder Herangehensweise geht. Um im Voraus (während der Entwicklung) zu bestimmen, wie viel Optimierung erforderlich sein kann, muss ein Programmierer eine gute Vorstellung von den Erfahrungen mit dem Problemfall in der Vergangenheit sowie ein gutes Verständnis für mögliche Lösungen haben.
In einigen Fällen kann die Verwendung von jQuery zu langsam sein (ein erfahrener Entwickler weiß das möglicherweise), während andere Zeiten kein Problem darstellen. In diesem Fall ist die browserübergreifende Konformität der Bibliothek und die einfache Ausführung anderer Funktionen (z. B. AJAX, Event-Handling) wäre die eingesparte Entwicklungs- (und Wartungs-) Zeit wert.
Ein anderes Beispiel ist, wenn Leistung und Optimierung alles wären, gäbe es keinen anderen Code als Maschine oder Baugruppe. Offensichtlich ist dies nicht der Fall, da es viele verschiedene Hoch- und Niedrigsprachen gibt, von denen jede ihre eigenen Kompromisse hat. Diese Kompromisse umfassen, ohne darauf beschränkt zu sein, Spezialisierung, einfache und schnelle Entwicklung, einfache und schnelle Wartung, optimierten Code, fehlerfreien Code usw.
Ansatz
Wenn Sie nicht genau wissen, ob für etwas optimierter Code erforderlich ist, ist es im Allgemeinen eine gute Faustregel, zuerst wartbaren Code zu schreiben. Von dort aus können Sie testen und genau bestimmen, was bei Bedarf mehr Aufmerksamkeit erfordert.
Bestimmte offensichtliche Optimierungen sollten jedoch Teil der allgemeinen Praxis sein und keinen Gedanken erfordern. Betrachten Sie beispielsweise die folgende Schleife:
for (var i=0; i < arr.length; ++i ){}
Für jede Iteration der Schleife ruft JavaScript die Kostenvorgänge für die arr.length
Schlüsselsuche in jedem Zyklus ab. Es gibt keinen Grund, warum dies nicht sein sollte:
for (var i=0, n=arr.length; i < n; ++i){}
Dies macht dasselbe, ruft jedoch nur arr.length
einmal ab, speichert die Variable zwischen und optimiert Ihren Code.