Die Verwendung der for...in
-Schleife für ein Array ist nicht falsch, obwohl ich vermuten kann, warum dir jemand das gesagt hat:
1.) Es gibt bereits eine höhere Funktion oder Methode, die für ein Array diesen Zweck erfüllt, aber mehr Funktionalität und schlankere Syntax hat, genannt 'forEach': Array.prototype.forEach(function(element, index, array) {} );
2.) Arrays haben immer eine Länge, aber for...in
und forEach
führen keine Funktion für einen Wert aus, der 'undefined'
ist, sondern nur für die Indizes, die einen definierten Wert haben. Wenn du also nur einen Wert zuweist, führen diese Schleifen die Funktion nur einmal aus, aber da ein Array aufgezählt wird, wird es immer eine Länge bis zum höchsten Index haben, der einen definierten Wert hat, aber diese Länge könnte unbemerkt bleiben, wenn du diese Schleifen benutzt.
3.) Die Standardschleife wird eine Funktion so oft ausführen, wie du es in den Parametern definierst, und da ein Array nummeriert ist, macht es mehr Sinn festzulegen, wie oft du eine Funktion ausführen möchtest. Im Gegensatz zu den anderen Schleifen kann die for-Schleife dann eine Funktion für jeden Index im Array ausführen, unabhängig davon, ob der Wert definiert ist oder nicht.
Im Grunde genommen kannst du jede Schleife verwenden, aber du solltest dich genau daran erinnern, wie sie funktionieren. Verstehe die Bedingungen, unter denen die verschiedenen Schleifen wiederholen, ihre unterschiedlichen Funktionalitäten und erkenne, dass sie mehr oder weniger geeignet für unterschiedliche Szenarien sein werden.
Es könnte auch als bessere Praxis angesehen werden, die Methode forEach
anstelle der for...in
-Schleife im Allgemeinen zu verwenden, da sie einfacher zu schreiben ist und mehr Funktionalität bietet. Du könntest also in die Gewohnheit kommen, nur diese Methode und die Standard for-Schleife zu verwenden, aber du entscheidest.
Sieh unten, dass die ersten beiden Schleifen die console.log-Anweisungen nur einmal ausführen, während die Standard for-Schleife die Funktion so oft ausführt wie angegeben, in diesem Fall array.length = 6.
var arr = [];
arr[5] = 'F';
for (var index in arr) {
console.log(index);
console.log(arr[index]);
console.log(arr)
}
// 5
// 'F'
// => (6) [undefined x 5, 6]
arr.forEach(function(element, index, arr) {
console.log(index);
console.log(element);
console.log(arr);
});
// 5
// 'F'
// => Array (6) [undefined x 5, 6]
for (var index = 0; index < arr.length; index++) {
console.log(index);
console.log(arr[index]);
console.log(arr);
};
// 0
// undefined
// => Array (6) [undefined x 5, 6]
// 1
// undefined
// => Array (6) [undefined x 5, 6]
// 2
// undefined
// => Array (6) [undefined x 5, 6]
// 3
// undefined
// => Array (6) [undefined x 5, 6]
// 4
// undefined
// => Array (6) [undefined x 5, 6]
// 5
// 'F'
// => Array (6) [undefined x 5, 6]
54 Stimmen
Ich habe die kürzlich gestellte Frage gesehen, bei der jemand das zu Ihnen gesagt hat, aber sie meinten nur für Arrays. Es gilt als schlechte Praxis, durch Arrays zu iterieren, aber nicht unbedingt für die Iteration durch Elemente eines Objekts.
22 Stimmen
Viele Antworten mit "for" -Schleifen wie 'for (var i=0; i
3 Stimmen
@MarkSchultheiss Aber das ist eine Rückwärtsschleife. Gibt es eine andere Version der Vorwärtsschleife, die schneller ist?
1 Stimmen
@MattDiPasquale - ja, es ist umgekehrt, jedoch bei einer bekannten Grenze ermöglicht es eine optimale Verarbeitung, insbesondere in älteren Browsern durch Iteration über eine bekannte Menge vs. eine unbekannte Satzlänge durch Festlegung der Grenze zuerst. Es ist die Natur einer interpretierten Sprache.
0 Stimmen
@MarkSchultheiss Guter Kommentar. Man könnte auch die
for
-Schleife schreiben alsfor (var i = hColl.length; i--;) {}
, was ein ähnliches Leistungsprofil wie die umgekehrtewhile
-Schleife haben sollte.5 Stimmen
@Wynand verwenden Sie
var i = hCol1.length; for (i; i; i--) {}
speichern Sie den i-Zähler, da dies einen Unterschied macht und den Test vereinfacht. - Je älter der Browser ist, desto größer ist der Unterschied zwischenfor
undwhile
IMMER den "i" Zähler zwischenspeichern - und natürlich passt negativ nicht immer zur Situation, und das negativeverdeckt
den Code etwas für einige Leute. und beachten Sievar i = 1000; for (i; i; i--) {}
undvar b = 1000 for (b; b--;) {}
wobei i von 1000 bis 1 und b von 999 bis 0 geht. - Je älter der Browser ist, desto mehr tendiert der while dazu, die Leistung zu favorisieren.12 Stimmen
Du kannst auch schlau sein.
for(var i = 0, l = myArray.length; i < l; ++i) ...
ist die schnellste und beste Möglichkeit, um eine Vorwärtsiteration durchzuführen.0 Stimmen
Es ist jetzt 10 Jahre später und ich verspüre den Drang hinzuzufügen: Auch wenn diese Optimierungen den Code leicht schneller machen: Es handelt sich um Mikro-Optimierungen. Wenn Sie Zweifel haben, entscheiden Sie sich für lesbaren Code, nicht für eine hoch optimierte Schleife über ein Array mit 1000 Elementen. Wenn etwas langsam ist, dann ist es normalerweise der Code, der innerhalb der Schleife ausgeführt wird, nicht die Schleifensteuerstruktur.