Das Problem mit for ... in ...
— und das wird nur dann ein Problem, wenn ein Programmierer die Sprache nicht wirklich versteht; es ist nicht wirklich ein Fehler oder so — ist, dass es über alle Mitglieder eines Objekts iteriert (nun ja, alle aufzählbaren Mitglieder, aber das ist jetzt ein Detail). Wenn Sie nur über die indizierten Eigenschaften eines Arrays iterieren möchten, dann ist der einzige garantierte Weg, um die semantische Konsistenz zu wahren, die Verwendung eines Ganzzahl-Index (also eine Schleife im Stil von for (var i = 0; i < array.length; ++i)
).
Jedes Objekt kann beliebige Eigenschaften haben. Es wäre nicht schlimm, zusätzliche Eigenschaften auf eine Array-Instanz zu laden. Code, der nur indizierte array-ähnliche Eigenschaften sehen möchte, muss daher bei einem Ganzzahl-Index bleiben. Code, der sich vollständig dessen bewusst ist, was for ... in
macht und wirklich alle Eigenschaften sehen muss, das ist auch in Ordnung.
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.