Ja, vorausgesetzt, Ihre Implementierung enthält die in ECMAScript 2015 eingeführte Funktion for...of (die "Harmony" -Version) ..., was heutzutage eine ziemlich sichere Annahme ist.
Es funktioniert so:
// REQUIRES ECMASCRIPT 2015+
var s, myStringArray = ["Hello", "World"];
for (s of myStringArray) {
// ... do something with s ...
}
Oder noch besser, da ECMAScript 2015 auch Variablen mit Blockbereich bietet:
// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
// ... do something with s ...
}
// s is no longer defined here
(Die Variable sist bei jeder Iteration unterschiedlich, kann jedoch constinnerhalb des Schleifenkörpers deklariert werden, solange sie dort nicht geändert wird.)
Ein Hinweis zu spärlichen Arrays: Ein Array in JavaScript speichert möglicherweise nicht so viele Elemente, wie von seinem gemeldet werden length. Diese gemeldete Zahl ist einfach eins größer als der höchste Index, bei dem ein Wert gespeichert wird. Wenn das Array weniger Elemente enthält als durch seine Länge angegeben, wird es als spärlich bezeichnet . Zum Beispiel ist es absolut legitim, ein Array mit Elementen nur in den Indizes 3, 12 und 247 zu haben. das s für fehlende Elemente, oder möchten Sie nur die tatsächlich vorhandenen Elemente verarbeiten? Es gibt viele Anwendungen für beide Ansätze; Es hängt nur davon ab, wofür Sie das Array verwenden.length eines solchen Arrays wird als 248 gemeldet, obwohl es tatsächlich nur 3 Werte speichert. Wenn Sie versuchen, auf ein Element in einem anderen Index zuzugreifen, scheint das Array dort den undefinedWert zu haben. Wenn Sie also ein Array "durchlaufen" möchten, müssen Sie eine Frage beantworten: Möchten Sie den gesamten Bereich durchlaufen, der durch seine Länge und seinen Prozess angezeigt wird?undefined
Wenn Sie ein Array mit for.. durchlaufen of, wird der Hauptteil der Schleife lengthmal ausgeführt , und die Regelungsvariable undefinedfür alle Elemente, die nicht im Array vorhanden sind, wird auf gesetzt. Abhängig von den Details Ihres Codes "Mach etwas mit" kann dieses Verhalten das sein, was Sie wollen, aber wenn nicht, sollten Sie einen anderen Ansatz verwenden.
Natürlich haben einige Entwickler keine andere Wahl, einen anderen Ansatz zu verwenden , wie auch immer, weil aus irgendeinem Grund sie eine Version von JavaScript Targeting sind , die noch nicht unterstützt for... of.
Solange Ihre JavaScript-Implementierung mit der vorherigen Ausgabe der ECMAScript-Spezifikation kompatibel ist (die beispielsweise Versionen von Internet Explorer vor 9 ausschließt), können Sie die Array#forEachIteratormethode anstelle einer Schleife verwenden. In diesem Fall übergeben Sie eine Funktion, die für jedes Element im Array aufgerufen werden soll:
var myStringArray = [ "Hello", "World" ];
myStringArray.forEach( function(s) {
// ... do something with s ...
} );
Im Gegensatz zu for... ofwird .forEachdie Funktion nur für Elemente aufgerufen, die tatsächlich im Array vorhanden sind. Wenn unser hypothetisches Array mit drei Elementen und einer Länge von 248 übergeben wird, wird die Funktion nur dreimal aufgerufen, nicht 248 Mal. Es wird auch zwischen fehlenden Elementen und Elementen unterschieden, die tatsächlich eingestellt sind undefined. Für letzteres wird die Funktion weiterhin aufgerufen und undefinedals Argument übergeben. Wenn Sie auf diese Weise mit spärlichen Arrays umgehen möchten, ist dies .forEachmöglicherweise der richtige Weg, auch wenn Ihr Interpreter for... unterstützt of.
Die letzte Option, die in allen Versionen von JavaScript funktioniert , ist eine explizite Zählschleife . Sie zählen einfach von 0 bis eins weniger als die Länge und verwenden den Zähler als Index. Die Grundschleife sieht folgendermaßen aus:
var i, s, myStringArray = [ "Hello", "World" ], len = myStringArray.length;
for (i=0; i<len; ++i) {
s = myStringArray[i];
// ... do something with s ...
}
Ein Vorteil dieses Ansatzes besteht darin, dass Sie auswählen können, wie mit spärlichen Arrays umgegangen werden soll. Der obige Code wird den Körper der Schleife der vollen läuft lengthmal mit sSatz undefinedfür alle fehlenden Elemente, wie for.. of. Wenn Sie stattdessen nur die tatsächlich vorhandenen Elemente eines spärlichen Arrays behandeln möchten .forEach, können Sie indem Index einen einfachen Test hinzufügen :
var i, s, myStringArray = [ "Hello", "World" ], len = myStringArray.length;
for (i=0; i<len; ++i) {
if (i in myStringArray) {
s = myStringArray[i];
// ... do something with s ...
}
}
Das Zuweisen des Längenwerts zur lokalen Variablen (im Gegensatz zum Einfügen des vollständigen myStringArray.lengthAusdrucks in die Schleifenbedingung) kann einen erheblichen Leistungsunterschied bewirken, da jedes Mal eine Eigenschaftssuche übersprungen wird. Wenn ich Rhino auf meinem Computer verwende, beträgt die Beschleunigung 43%.
Möglicherweise sehen Sie das Längen-Caching in der Schleifeninitialisierungsklausel wie folgt:
var i, len, myStringArray = [ "Hello", "World" ];
for (len = myStringArray.length, i=0; i<len; ++i) {
Die explizite Zählschleife bedeutet auch, dass Sie auf den Index jedes Werts zugreifen können, falls Sie dies wünschen. Der Index wird auch als zusätzlicher Parameter an die Funktion übergeben forEach, an die Sie übergeben , sodass Sie auch auf diese Weise darauf zugreifen können:
myStringArray.forEach( function(s, i) {
// ... do something with s and i ...
});
for... ofgibt Ihnen nicht den Index an, der jedem Objekt zugeordnet ist, aber solange das Objekt, über das Sie iterieren, tatsächlich ein Objekt ist Array( for.. offunktioniert für andere iterierbare Typen, die diese Methode möglicherweise nicht haben), können Sie das Array verwenden #entries- Methode, um sie in ein Array von [index, item] -Paaren zu ändern und dann darüber zu iterieren:
for (const [i, s] of myStringArray.entries()) {
// ... do something with s and i ...
}
Das forin von anderen erwähnte ... -Syntax dient zum Durchlaufen der Eigenschaften eines Objekts. Da ein Array in JavaScript nur ein Objekt mit numerischen Eigenschaftsnamen (und einer automatisch aktualisierten lengthEigenschaft) ist, können Sie theoretisch ein Array damit durchlaufen. Das Problem ist jedoch, dass es sich nicht auf die numerischen Eigenschaftswerte beschränkt (denken Sie daran, dass selbst Methoden eigentlich nur Eigenschaften sind, deren Wert ein Abschluss ist), und es wird auch nicht garantiert, dass es über diese in numerischer Reihenfolge iteriert. Daher sollte die for... in-Syntax nicht zum Durchlaufen von Arrays verwendet werden.