Ich wurde darauf hingewiesen, dass ich in JavaScript for...in
nicht mit Arrays verwenden soll. Warum?
Antworten
Zu viele Anzeigen?Da JavaScript-Elemente als Standardobjekteigenschaften gespeichert sind, ist es nicht ratsam, JavaScript-Arrays mit for...in-Schleifen zu durchlaufen, 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 diese Frage nicht explizit behandelt wird, würde ich hinzufügen, dass es ein sehr guter Grund ist, niemals for...in
mit einem NodeList
zu verwenden (wie man es von einem querySelectorAll
-Aufruf erhalten würde), da es die zurückgegebenen Elemente überhaupt nicht sieht, sondern nur über die NodeList-Eigenschaften iteriert.
Im Fall eines einzelnen Ergebnisses bekam 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;
fehlschlug.
- See previous answers
- Weitere Antworten anzeigen
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.