Bei einem einfachen, auf Null basierenden, numerisch indizierten Array:
var list = ['Foo', 'Bar', 'Baz'];
Ich habe oft bemerkt, dass, wenn jemand vorschlägt, Variablen in einem Array wie diesem zu durchlaufen:
for(var item in list) { ... }
... gibt es mit ziemlicher Sicherheit jemanden, der dies für eine schlechte Praxis hält und einen alternativen Ansatz vorschlägt:
var count = list.length;
for(var i = 0; i < count; i++) {
var item = list[i];
...
}
Was ist der Grund dafür, die einfachere Version oben nicht zu verwenden und stattdessen das zweite Beispiel zu verwenden?
javascript
arrays
loops
Tatu Ulmanen
quelle
quelle
Antworten:
Erstens ist die Reihenfolge der Schleife für eine
for...in
Schleife undefiniert , sodass nicht garantiert werden kann, dass die Eigenschaften in der gewünschten Reihenfolge wiederholt werden.Zweitens werden
for...in
alle aufzählbaren Eigenschaften eines Objekts durchlaufen, einschließlich der von seinem Prototyp geerbten. Im Fall von Arrays kann dies Auswirkungen auf Sie haben, wenn Ihr Code oder eine auf Ihrer Seite enthaltene Bibliothek den Prototyp von erweitert hat. DiesArray
kann sehr nützlich sein:Array.prototype.remove = function(val) { // Irrelevant implementation details }; var a = ["a", "b", "c"]; for (var i in a) { console.log(i); } // Logs 0, 1, 2, "remove" (though not necessarily in that order)
quelle
hasOwnProperty
-for (var i in a) { if (a.hasOwnProperty(i)) console.log(i); }
-> 1 2 3over all properties
zuover **enumerable** properties
. In neueren Javascript-Implementierungen können Eigenschaften mit demenumerable
Attribut definiert werdenfalse
. Diese Eigenschaften und Eigenschaften von integrierten Javascript-Objekten werden in a nicht angezeigtfor...in
.Geschwindigkeit?
for(..;..;..)
Die Schleife erwies sich als 36-mal schneller alsfor .. in
beim Testen hier.Link mit freundlicher Genehmigung dieser SO-Antwort
quelle
Wenn Sie für / in so verwenden,
item
werden die Zeichenfolgenwerte "0", "1", ... aufgelistet, also nicht die tatsächlichen Objekte in der Liste. Das 'Element' im ersten Snippet ähnelt also eher demi
im zweiten Snippet, nicht demitem
. Außerdem werden Zeichenfolgenwerte dort aufgelistet, wo Sie Zahlen erwarten würden. Und Sie bekommen Probleme, wenn Sie Eigenschaften in die Liste aufnehmen, wiearray.ID = "a123"
sie auch aufgezählt werden.Aber mit diesen Nachteilen denke ich immer noch, dass die Syntax sehr nützlich ist, wenn Ihr Team weiß, was es tut.
quelle
for ... in ...
Gibt keine Listenelemente zurück, sondern listet die Array-Eigenschaften auf.Allein aus diesem Grund kann es nicht als Ersatz für eine
for (i=0; i<arr.length; i++)
Schleife dienen.Die geeignete Alternative ist
for ... of ...
Konstrukt. Es listet Werte eines iterierbaren Objekts auf, z. B. eines Arrays. Weitere Informationen finden Sie in den MDN-Webdokumenten: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...ofEs wird von den relevanten modernen Browsern unterstützt (Internet Explorer zählt nicht und wird durch Microsoft Edge ersetzt). Wenn Sie es sich leisten können, ältere Browser nicht zu unterstützen, ist dies wahrscheinlich der richtige Weg. Sie können die praktische Browser-Support-Tabelle am Ende der oben genannten MDN-Seite überprüfen, um festzustellen, welche Browserversionen tatsächlich die
for ... of ...
Verwendung zulassen .quelle
Fügen Sie hinzu
list.foo = bar;
und versuchen Sie, einfach zu verwendenfor
. Wenn Sie einige Bibliotheken (wie prototypeJs) nicht verwenden und dem Array-Objekt keine neuen Eigenschaften hinzufügen, können Sie eine einfache for-Anweisung verwenden.quelle