Was ist der aktuelle Standard in 2017 in Javascript mit for () Schleifen vs .forEach.
Zur Zeit arbeite ich mich durch Colt Steeles „Web Dev Boot Camp“ auf Udemy und er spricht forEach
über for
seine Lehre. Ich habe jedoch während der Übungen im Rahmen der for
Kursarbeit nach verschiedenen Dingen gesucht und finde immer mehr Empfehlungen, eine- Schleife anstelle von zu verwenden forEach
. Die meisten Leute scheinen zu sagen, dass die for-Schleife effizienter ist.
Ist dies etwas, das sich seit dem Schreiben des Kurses (ca. 2015) geändert hat, oder sind es die wirklichen Vor- und Nachteile für jeden, den man mit mehr Erfahrung lernen wird?
Jeder Rat wäre sehr dankbar.
javascript
loops
for-loop
foreach
Tonyrobbins
quelle
quelle
for
ist für reine Geschwindigkeit schwer zu schlagen.forEach()
ruft für jede Iteration einen Rückruf auf; Das bringt natürlich etwas Aufwand mit sich.map
nur für die Iteration verwenden und das neue Array, das es generiert, verwerfen . Ich weiß nicht, wie viele Personen ich allein auf dieser Site für diese bestimmte Funktionsauswahl korrigieren musste.Antworten:
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: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 sindfor
.Leistungen:
break
undcontinue
)i<n
kann alles sein und ist nicht an die Größe eines Arrays gebunden)var i
Blätteri
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
undSet
Objekte). Sie sind neuer und bieten Code, der subjektiv leichter zu lesen ist. Beispiel:Leistungen:
Im obigen Beispiel
val
wäre dies ein Parameter der neu erstellten Funktion. Daher würden alle Variablen, dieval
vor der Schleife aufgerufen werden , ihre Werte nach deren Ende beibehalten.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:
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:Dies macht dasselbe, ruft jedoch nur
arr.length
einmal ab, speichert die Variable zwischen und optimiert Ihren Code.quelle
[...], if performance and optimization was everything, there would be no other code than machine or assembly.
. Ich glaube, dass mit derlet
Anweisung zum Deklarieren einer lokalen Variablen für den Blockbereich der zweite Vorteil vonforEach
kein Vorteil mehr gegenüber derfor
Schleife ist, es sei denn in einer Umgebung ohne Unterstützung fürlet
.