Die for...in
Anweisung durchläuft die Eigenschaften/Attribute (nur enumerable Eigenschaften) eines Objekts in willkürlicher Reihenfolge. Für jede einzele Eigenschaft können Anweisungen ausgeführt werden.
Syntax
for (variable in object) {... }
variable
- in jedem Schleifendurchlauf wird der Name einer Eigenschaft der variable zugewiesen.
object
- Das Objekt dessen Eigenschaften / Attribute durchlaufen werden sollen.
Beschreibung
Eine for...in
Schleife durchläuft nur die aufzählbaren Eigenschaften. Objekte die "built–in constructors" wie Array
und Object
abgeleitet werden, haben von Object.prototype und String.prototype geerbte nicht-durchzählbare Eigenschaften, wie String
's indexOf()
Methode oder Object
's toString()
Methode. Die Schleife durchläuft alle (zählbaren) "enumerable" Eigenschaften des Objekts selber und diejenigen die das Objekt vom Constructor seines prototypes geerbt hat (Eigenschaften näher am Objekt in der prototype Kette überschreiben die Eigenschaften des Prototypes).
Gelöschte, hinzugefügte oder modifizierte Properties
Eine for...in
Schleife iteriert über die Properties eines Objektes in beliebiger Reihenfolge (siehe auch delete
um mehr darüber zu erfahren warum man sich nicht auf die scheinbare Ordnung der Iteration verlassen kann, zumindestens nicht in einer Cross-Browser-Umgebung). Falls eine Property in einer Iteration verändert wird und später erneut ausgelesen wird, dann ist ihr Wert innerhalb der Schleife derselbe wie der zum späteren Zeitpunkt. Eine Property die gelöscht wurde bevor sie besucht wurde, wird später nicht besucht. Properties die während der Iteration zu einem Objekt, über dessen Properties gerade iteriert wird, hinzugefügt werden, werden entweder besucht oder ignoriert von der Iteration. Im Allgemeinen ist es ratsam während der Iteration keine Properties hinzuzufügen, zu verändern oder zu entfernen außer der Property die gerade besucht wird. Es gibt keine Garantie ob eine hinzugefügte Property besucht wird, eine geänderte (außer der aktuell besuchten) besucht wird bevor oder nachdem sie besucht wurde, oder eine gelöschte Property besucht wird bevor sie gelöscht wird.
Array Iteration und for...in
Hinweis: for..in
sollte nicht für die Iteration von einem Array
verwendet werden, bei denen die Indexreihenfolge wichtig ist.
Array Indizes sind aufzählbare Eigenschaften mit Ganzzahlen als Namen und sind ansonsten identisch zu allgemeinen Objekteigenschaften. Es ist nicht sichergestellt, dass for...in
die Indizes in einer bestimmten Reihenfolge zurück gibt und liefert außerdem auch alle aufzählbaren Eigenschaften zurück, einschließlich derer mit nicht ganzzahligen Namen und geerbten.
Weil die Reihenfolge bei der Iteration von der Implementierung abhängt, werden die Elemente nicht einer konsistenten Reihenfolge abgerufen. Daher ist es besser, eine for
Schleife mit numerischem Index (oder Array.prototype.forEach()
oder die for...of
Schleife) zu verwenden, wenn beim Durchlaufen des Arrays die Reihenfolge des Zugriff wichtig ist.
Iteration nur über eigene Eigenschaften
Falls Sie nur Eigenschaften berücksichtigen möchten, die direkt mit dem Objekt und nicht mit dem Prototypen verknüpft sind, verwenden Sie getOwnPropertyNames()
oder nutzen Sie eine hasOwnProperty()
Prüfung ( propertyIsEnumerable
kann auch verwendet werden). Alternativ können Sie auch den eingebauten Prototypen mit einer Prüfmethode erweitern, falls sichergestellt ist, dass es nicht zu einer Beeinflussung von externem Code kommt.
Beispiele
Die folgende Funktion erwartet ein Objekt als Argument. Es werden dann alle aufzählbaren Eigenschaften des Objekts durchlaufen und der Name der Eigenschaften mit dem entsprechenden Werte ausgegeben.
var obj = {a:1, b:2, c:3}; for (var prop in obj) { console.log("o." + prop + " = " + obj[prop]); } // Ausgabe: // "o.a = 1" // "o.b = 2" // "o.c = 3"
Die folgende Funktion verdeutlicht die Verwendung von hasOwnProperty()
: die geerbten Eigenschaften werden nicht angezeigt.
var triangle = {a:1, b:2, c:3}; function ColoredTriangle() { this.color = "red"; } ColoredTriangle.prototype = triangle; var obj = new ColoredTriangle(); for (var prop in obj) { if( obj.hasOwnProperty( prop ) ) { console.log("o." + prop + " = " + obj[prop]); } } // Ausgabe: // "o.color = red"
Spezifikationen
Browserkompatibilität
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Ja) | (Ja) | 6 | (Ja) | (Ja) |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Ja) | (Ja) | (Ja) | (Ja) | (Ja) | (Ja) |
Kompatibilität: Initial-Ausdruck
Vor SpiderMonkey 40 (Firefox 40 / Thunderbird 40 / SeaMonkey 2.37), war es möglich einee Initial-Ausdruck (i=0
) in einer for...in
Schleife zu benutzen:
var obj = {a:1, b:2, c:3}; for(var i=0 in obj) { console.log(obj[i]); } // 1 // 2 // 3
Das nicht standardisierte Verhalten wird ab der Version 40 und später ignoriert und führt zu einem SyntaxError
("for-in loop head declarations may not have initializers") Warnung in der Console (Bug 748550 und Bug 1164741).
Andere Umgebungen wie v8 (Chrome), Chakra (IE/Edge), und JSC (WebKit/Safari) investieren ebenfalls in die Entfernung dieses Verhaltens.
Siehe auch
for...of
- eine änhliche Anweisung, die Eigenschaftswerte durchläuftfor each in
- eine änhliche Anweisung , die nicht die Namen sondern Werte von Objekteigenschaften durchläuft (veraltet)for
- Generatorausdrücke (verwenden Sie die
for...in
Syntax) - Aufzählbarkeit und Besitz von Eigenschaften
Object.getOwnPropertyNames()
Object.prototype.hasOwnProperty()
Array.prototype.forEach()