Ich habe viele Fragen gesehen, die vorschlagen, Folgendes zu verwenden:
for (var i = 0; i < myArray.length; i++){ /* ... */ }
anstatt:
for (var i in myArray){ /* ... */ }
für Arrays aufgrund inkonsistenter Iteration ( siehe hier ).
Ich kann jedoch anscheinend nichts finden, was die objektorientierte Schleife zu bevorzugen scheint:
myArray.forEach(function(item, index){ /* ... */ });
Was mir viel intuitiver erscheint.
Für mein aktuelles Projekt ist die IE8-Kompatibilität wichtig, und ich denke darüber nach, Mozillas Polyfill zu verwenden . Ich bin mir jedoch nicht 100% sicher, wie dies funktionieren wird.
- Gibt es Unterschiede zwischen dem Standard für die Schleife (das erste Beispiel oben) und der Implementierung von Array.prototype.forEach durch moderne Browser?
- Gibt es einen Unterschied zwischen modernen Browser-Implementierungen und der oben genannten Implementierung von Mozilla (unter besonderer Berücksichtigung von IE8)?
- Die Leistung ist weniger ein Problem, sondern nur die Konsistenz, mit der die Eigenschaften wiederholt werden.
javascript
arrays
for-loop
internet-explorer-8
iterator
Michael Lewis
quelle
quelle
break
rauszukommenforEach
. Ein großer Vorteil ist jedoch die Schaffung eines neuen Bereichs mit der Funktion. Mit der Polyfüllung sollten Sie keine Probleme haben (zumindest bin ich auf keine gestoßen).holes
wo es seinundefined
sollte, und andere kaputte Methoden, wieslice
undhasOwnProperty
wrt zu arraylike DOM-Objekten. Meine Testses5 shim
haben gezeigt, dass solche Shimmed-Methoden der Spezifikation entsprechen (nicht getestete MDN-Shim).for
Schleife auszubrechen , ist das das, wofürsome
.Array.find()
, um aus der Schleife auszubrechen, nachdem Sie eine erste Übereinstimmung gefunden haben.Antworten:
Der wesentlichste Unterschied zwischen der
for
Schleife und derforEach
Methode besteht darin, dass Sie mit der ersteren möglicherweisebreak
aus der Schleife herauskommen. Sie können simulieren,continue
indem Sie einfach von der an übergebenen Funktion zurückkehren. EsforEach
gibt jedoch keine Möglichkeit, die Schleife insgesamt zu beenden.Abgesehen davon erreichen die beiden effektiv die gleiche Funktionalität. Ein weiterer kleiner Unterschied betrifft den Umfang des Index (und aller enthaltenen Variablen) in der for-Schleife aufgrund des Hebens von Variablen.
Ich finde das
forEach
jedoch viel ausdrucksvoller - es repräsentiert Ihre Absicht, jedes Element eines Arrays zu durchlaufen, und bietet Ihnen einen Verweis auf das Element, nicht nur auf den Index. Insgesamt kommt es hauptsächlich auf den persönlichen Geschmack an, aber wenn Sie es verwenden könnenforEach
, würde ich empfehlen, es zu verwenden.Es gibt einige wesentliche Unterschiede zwischen den beiden Versionen, insbesondere in Bezug auf die Leistung. Tatsächlich ist die einfache for-Schleife erheblich besser als die
forEach
Methode, wie dieser jsperf-Test zeigt .Ob eine solche Leistung für Sie erforderlich ist oder nicht, liegt bei Ihnen. In den meisten Fällen würde ich Ausdruckskraft gegenüber Geschwindigkeit bevorzugen. Dieser Geschwindigkeitsunterschied ist wahrscheinlich auf die geringfügigen semantischen Unterschiede zwischen der Basisschleife und der Methode zurückzuführen, wenn mit spärlichen Arrays gearbeitet wird, wie in dieser Antwort angegeben .
Wenn Sie das Verhalten von
forEach
und / oder das frühzeitige Ausbrechen aus der Schleife nicht benötigen , können Sie_.each
alternativ Lo-Dash's verwenden , die auch browserübergreifend funktionieren. Wenn Sie jQuery verwenden, bietet es auch eine ähnliche Funktion$.each
. Beachten Sie lediglich die Unterschiede in den Argumenten, die in jeder Variante an die Rückruffunktion übergeben werden.(Die
forEach
Polyfüllung sollte in älteren Browsern problemlos funktionieren, wenn Sie diesen Weg wählen.)quelle
each
nicht wie die ECMA5-Spezifikation von verhaltenforEach
, sondern dazu neigen, alle Arrays als dicht zu behandeln (um IE-Fehler zu vermeiden, sofern Sie dies wissen). Kann sonst ein "Gotcha" sein. Als Referenz github.com/es-shims/es5-shim/issues/190Array.prototype.some
welche Schleife, bis Sie einen wahrheitsgemäßen Wert zurückgeben oder bis sie das Array vollständig durchlaufen hat.Array.prototype.every
ist ähnlich,Array.prototype.some
stoppt jedoch, wenn Sie einen falschen Wert zurückgeben.Array.prototype.forEach
mit einer nicht kompatiblen Version hätte das Potenzial, so viele Bibliotheken zu beschädigen, dass es sowieso nicht helfen würde, es aus diesem Grund zu vermeiden.Sie können Ihre benutzerdefinierte foreach-Funktion verwenden, die eine viel bessere Leistung als Array.forEach bietet
Sie sollten dies einmal zu Ihrem Code hinzufügen. Dadurch wird dem Array eine neue Funktion hinzugefügt.
Dann können Sie es überall wie Array.forEach verwenden
Der einzige Unterschied ist, dass es dreimal schneller ist. https://jsperf.com/native-arr-foreach-vs-custom-foreach
UPDATE: In der neuen Chrome-Version wurde die Leistung von .forEach () verbessert. Die Lösung kann jedoch die zusätzliche Leistung in anderen Browsern bieten.
quelle
Es wird von vielen Entwicklern (z. B. Kyle Simpson) empfohlen, zu verwenden,
.forEach
um anzuzeigen, dass das Array einen Nebeneffekt hat, und.map
für reine Funktionen.for
Schleifen eignen sich gut als Allzwecklösung für die bekannte Anzahl von Schleifen oder für jeden anderen Fall, der nicht passt, da die Kommunikation aufgrund der breiten Unterstützung für die meisten Programmiersprachen einfacher ist.z.B
Konventionell scheint dies am besten zu sein, jedoch hat sich die Community nicht wirklich auf eine Konvention für die neueren Iterationsprotokollschleifen festgelegt
for in
. Generell halte ich es für eine gute Idee, den FP-Konzepten zu folgen, für deren Übernahme die JS-Community offenbar offen ist.quelle