Man hat mir gesagt, for...in
nicht mit Arrays in JavaScript zu verwenden. Warum nicht?
Antworten
Zu viele Anzeigen?Da JavaScript-Elemente als Standardobjekteigenschaften gespeichert werden, ist es nicht ratsam, über JavaScript-Arrays mit for...in-Schleifen zu iterieren, da normale Elemente und alle aufzählbaren Eigenschaften aufgelistet werden.
Von https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_collections
Auch wenn in dieser Frage nicht speziell angesprochen, würde ich hinzufügen, dass es einen sehr guten Grund gibt, niemals for...in mit einer NodeList
zu verwenden (wie man sie bei einem querySelectorAll
-Aufruf erhalten würde), da sie die zurückgegebenen Elemente überhaupt nicht sieht, sondern nur über die Eigenschaften der NodeList iteriert.
im Fall eines einzelnen Ergebnisses erhielt ich:
var nodes = document.querySelectorAll(selector);
nodes
NodeList [a._19eb]
for (node in nodes) {console.log(node)};
VM505:1 0
VM505:1 length
VM505:1 item
VM505:1 entries
VM505:1 forEach
VM505:1 keys
VM505:1 values
was erklärt, warum mein for (node in nodes) node.href = newLink;
nicht funktionierte.
- See previous answers
- Weitere Antworten anzeigen
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.