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

Spezifikation Status Kommentar
ECMAScript 2017 Draft (ECMA-262)
Die Definition von 'for...in statement' in dieser Spezifikation.
Entwurf  
ECMAScript 2015 (6th Edition, ECMA-262)
Die Definition von 'for...in statement' in dieser Spezifikation.
Standard  
ECMAScript 5.1 (ECMA-262)
Die Definition von 'for...in statement' in dieser Spezifikation.
Standard  
ECMAScript 3rd Edition (ECMA-262)
Die Definition von 'for...in statement' in dieser Spezifikation.
Standard  
ECMAScript 1st Edition (ECMA-262)
Die Definition von 'for...in statement' in dieser Spezifikation.
Standard Initiale Definition.

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

Schlagwörter des Dokuments und Mitwirkende

Schlagwörter: 
 Mitwirkende an dieser Seite: schlagi123, KuhnEDV, JohannesDienst, fscholz, lupo72
 Zuletzt aktualisiert von: schlagi123,