Die Verwendung der for...in
-Schleife für ein Array ist nicht falsch, obwohl ich vermute, warum dir jemand das gesagt hat:
1.) Es gibt bereits eine High-Order-Funktion oder Methode, die den Zweck für ein Array erfüllt, jedoch mehr Funktionalität und schlankere Syntax hat, namens '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 Werte aus, die 'undefined'
sind, sondern nur für die Indizes, die einen definierten Wert haben. Wenn du also nur einen Wert zuweist, wird diese Schleife die Funktion nur einmal ausführen, aber da ein Array aufgelistet ist, wird es immer eine Länge bis zum höchsten Index haben, der einen definierten Wert hat, jedoch könnte diese Länge beim Verwenden dieser Schleifen unbemerkt bleiben.
3.) Die Standard-For-Schleife führt eine Funktion so oft aus, 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 Wesentlichen kannst du jede Schleife verwenden, aber du solltest genau daran denken, wie sie funktionieren. Verstehe die Bedingungen, unter denen sich die verschiedenen Schleifen wiederholen, ihre separaten Funktionalitäten und erkenne, dass sie mehr oder weniger für unterschiedliche Szenarien geeignet sind.
Es kann auch als bessere Praxis angesehen werden, die forEach
-Methode anstelle der for...in
-Schleife im Allgemeinen zu verwenden, da sie einfacher zu schreiben ist und mehr Funktionalität bietet. Daher solltest du dich vielleicht daran gewöhnen, 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ürzliche Frage gesehen, in der jemand das zu dir gesagt hat, aber sie meinten nur für Arrays. Es wird als schlechte Praxis betrachtet, 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ärtsiteration. Gibt es eine andere Version der Vorwärtsiteration, die schneller ist?
1 Stimmen
@MattDiPasquale - Ja, es ist umgekehrt, jedoch unter einer bekannten Grenze ermöglicht es eine optimale Verarbeitung, insbesondere in älteren Browsern, durch Iteration über einen bekannten Satz im Gegensatz zu einer unbekannten Satzlänge, indem die Grenze zuerst festgelegt wird. Es ist die Natur einer interpretierten Sprache.
0 Stimmen
@MarkSchultheiss Guter Kommentar. Man könnte die
for
-Schleife auch alsfor (var i = hColl.length; i--;) {}
schreiben, 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 das i im Cache, da es einen Unterschied macht und den Test vereinfacht. - je älter der Browser, desto größer der Unterschied zwischenfor
undwhile
IMMER den "i" Zähler im Cache speichern - und natürlich passt negativ nicht immer zur Situation und das Negative, währendobfuscate
den Code für einige Leute ein wenig verkompliziert. und beachten Sievar i = 1000; for (i; i; i--) {}
undvar b =1000 for (b; b--;) {}
wobei i von 1000 auf 1 und b von 999 auf 0 geht. - je älter der Browser, desto mehr neigt das while zur Leistungssteigerung.12 Stimmen
Sie können auch klug sein.
for(var i = 0, l = myArray.length; i < l; ++i) ...
ist die schnellste und beste Möglichkeit, die Sie mit einem Vorwärtsdurchlauf erhalten können.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 sind Mikro-Optimierungen. Wenn Sie sich unsicher sind, entscheiden Sie sich für lesbaren Code, nicht für eine stark 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 Schleifensteuerung.