aboutsummaryrefslogtreecommitdiff
path: root/files/de/web/javascript/reference/statements/for...in/index.html
blob: dfa0a72c50e79fb00ae867b9be9d3a4d74886692 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
---
title: for...in
slug: Web/JavaScript/Reference/Statements/for...in
tags:
  - JavaScript
  - Statement
translation_of: Web/JavaScript/Reference/Statements/for...in
---
<div>
<div>{{jsSidebar("Statements")}}</div>
</div>

<p>Die Schleife <code>for…in</code> durchläuft alle <a href="/de/docs/Web/JavaScript/Aufzählbarkeit_und_Zugehörigkeit_von_Eigenschaften">aufzählbaren Eigenschaften</a> eines Objekts (mit Ausnahme jener, deren Name ein <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol">Symbol</a> ist) in willkürlicher Reihenfolge und führt für jede ihren Anweisungsblock aus.</p>

<p><strong style="">Syntax</strong></p>

<pre class="syntaxbox">for (<var>variable</var> in <var>object</var>) {<em>...</em> }</pre>

<dl>
 <dt><code>variable</code></dt>
 <dd>Bei jedem Schleifendurchlauf wird der Name der aktuellen Eigenschaft <em>variable</em> zugewiesen.</dd>
 <dt><code>object</code></dt>
 <dd>Das Objekt, dessen Eigenschaften durchlaufen werden sollen.</dd>
</dl>

<h2 id="Description" name="Description">Beschreibung</h2>

<p>Die Schleife <code>for…in</code> durchläuft alle eigenen und geerbten Eigenschaften, die als aufzählbar gekennzeichnet sind und deren Name kein <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol">Symbol</a> ist, in einer nicht festgelegten Reihenfolge.</p>

<h4 id="Aufzählbare_Eigenschaften">Aufzählbare Eigenschaften</h4>

<p>Die Eigenschaften eines Javascript-Objekts können anhand ihres internen Statusfeldes <code>enumerable</code> als <a href="/de/docs/Web/JavaScript/Aufzählbarkeit_und_Zugehörigkeit_von_Eigenschaften">aufzählbar oder nicht aufzählbar</a> gekennzeichnet werden.</p>

<p>Insbesondere erben manche eingebaute Objekte wie <code>Array</code> und <code>Object</code> nicht-aufzählbare Eigenschaften<span style="line-height: 1.5;"> von </span><code>Object.prototype</code> and <code>String.prototype</code><span style="line-height: 1.5;">, unter anderem die Methoden {{jsxref("String.indexOf")}} und {{jsxref("Object.toString")}}. </span></p>

<p><span style="line-height: 1.5;">Nicht-aufzählbare Eigenschaften werden von </span> <code>for…in</code> ignoriert.</p>

<h4 id="Reihenfolge">Reihenfolge</h4>

<p>Obwohl die Reihenfolge bei Ausführung innerhalb desselben Interpreters als festgelegt erscheinen kann, darf von diesem Umstand nicht ausgegangen werden. Andere Versionen und insbesondere andere Javascript-Interpreter werden die Eigenschaften in einer anderen Reihenfolge durchlaufen.<br>
 Die Gründe sind in der Beschreibung des Operators {{jsxref("Operators/delete", "delete")}} näher erklärt.</p>

<h4 id="Gelöschte_hinzugefügte_oder_modifizierte_Eigenschaften">Gelöschte, hinzugefügte oder modifizierte Eigenschaften</h4>

<p>Änderungen der Eigenschaften eines Objekts, während dieses Objekt von <code>for…in</code> durchlaufen wird, haben nachfolgende Auswirkungen:</p>

<ul>
 <li>Eine Änderung des Wertes einer Eigenschaft wirkt sich sofort auf alle nachfolgenden Schleifendurchläufe aus.</li>
 <li>Eine Eigenschaft, die gelöscht wurde, bevor die Schleife sie eigentlich erreicht hätte, wird nicht mehr aufgerufen.</li>
 <li>Eine Eigenschaft, die hinzugefügt wird, kann von der Schleife noch abgearbeitet werden, muss jedoch nicht. Das Verhalten ist nicht vorhersehbar.</li>
</ul>

<p>Im Allgemeinen ist es ratsam, innerhalb einer Schleife keine Änderungen an den Eigenschaften des durchlaufenden Objekts vorzunehmen. Eine Ausnahme bildet lediglich die derzeit bearbeitete Eigenschaft.<br>
 Es gibt keine Garantie, dass eine hinzugefügte Eigenschaft von der Schleife noch aufgerufen wird, ob eine geänderte (außer der aktuellen) Eigenschaft vor oder nach der Änderung aufgerufen wird oder ob eine gelöschte Eigenschaft aufgerufen wird, bevor sie gelöscht wird.</p>

<h3 id="Array_und_for…in">Array und for…in</h3>

<div class="note">
<p><strong>Hinweis:</strong> <strong><code>for…in</code> sollte nicht für den Durchlauf eines {{jsxref("Array", "Arrays")}} verwendet werden, bei dem die Indexreihenfolge wichtig ist.</strong></p>
</div>

<p>Anders als vielleicht von vielen anderen Programmiersprachen gewohnt sind bei Javascript die Indizes eines Feldes normale Objekt-Eigenschaften mit Ganzzahlen als Namen.</p>

<p>Wie oben bereits erwähnt, ist nicht sichergestellt, dass <code>for…in</code> Eigenschaften eines Objektes in einer bestimmten Reihenfolge durchläuft. Dies gilt, da sie normale Eigenschaften sind, auch für die Feldindizes. Zudem durchläuft <code>for…in</code> auch alle anderen (aufzählbaren) Eigenschaften, einschließlich derer mit nicht ganzzahligen Namen sowie geerbte.</p>

<p><code>for…in</code> ist daher nicht geeignet, um die Felder eines Objekts vom Typ Array von 0 bis Array.length der Reihenfolge nach zu durchlaufen.<br>
 Zu diesem Zweck kann entweder auf eine {{jsxref("Statements/for", "for-Schleife")}} mit numerischem Zähler, die Array-eigene Methode {{jsxref("Array.prototype.forEach()", "forEach()")}} oder eine {{jsxref("Statements/for...of", "for...of-Schleife")}} verwendet werden.</p>

<h3 id="Durchlauf_nur_über_eigene_Eigenschaften">Durchlauf nur über eigene Eigenschaften</h3>

<p>Sollen nur Eigenschaften berücksichtigen möchten, die direkt mit dem Objekt verknüpft und nicht von dessen Prototypen geerbt sind, bietet sich {{jsxref("Object.getOwnPropertyNames", "getOwnPropertyNames()")}} an. Die Zugehörigkeit auf einer bestimmten Eigenschaft kann mit {{jsxref("Object.prototype.hasOwnProperty", "hasOwnProperty()")}} geprüft werden.<br>
 Alternativ können eingebaute Prototypen mit einer Prüfmethode erweitert werden, sofern sichergestellt ist, dass es nicht zu einer Beeinflussung von externem Code kommt.</p>

<h2 id="Example" name="Example">Beispiele</h2>

<p>Die folgende Funktion erwartet ein Objekt als Argument. Es werden dann alle aufzählbaren Eigenschaften des Objekts durchlaufen und der Name der Eigenschaft mit dem entsprechenden Wert ausgegeben.</p>

<pre class="brush: js">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"</pre>

<p>Die folgende Funktion verdeutlicht die Verwendung von {{jsxref("Object.hasOwnProperty", "hasOwnProperty()")}}: die geerbten Eigenschaften werden nicht angezeigt.</p>

<pre class="brush: js">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"
</pre>

<h2 id="Spezifikationen">Spezifikationen</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Spezifikation</th>
   <th scope="col">Status</th>
   <th scope="col">Kommentar</th>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-for-in-and-for-of-statements', 'for...in statement')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td></td>
  </tr>
  <tr>
   <td>{{SpecName('ES6', '#sec-for-in-and-for-of-statements', 'for...in statement')}}</td>
   <td>{{Spec2('ES6')}}</td>
   <td></td>
  </tr>
  <tr>
   <td>{{SpecName('ES5.1', '#sec-12.6.4', 'for...in statement')}}</td>
   <td>{{Spec2('ES5.1')}}</td>
   <td></td>
  </tr>
  <tr>
   <td>{{SpecName('ES3', '#sec-12.6.4', 'for...in statement')}}</td>
   <td>{{Spec2('ES3')}}</td>
   <td></td>
  </tr>
  <tr>
   <td>{{SpecName('ES1', '#sec-12.6.3', 'for...in statement')}}</td>
   <td>{{Spec2('ES1')}}</td>
   <td>Initiale Definition.</td>
  </tr>
 </tbody>
</table>

<h2 id="Browserkompatibilität">Browserkompatibilität</h2>

<p>{{ CompatibilityTable() }}</p>

<div id="compat-desktop">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Chrome</th>
   <th>Firefox (Gecko)</th>
   <th>Internet Explorer</th>
   <th>Opera</th>
   <th>Safari</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>6</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>

<div id="compat-mobile">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Android</th>
   <th>Chrome for Android</th>
   <th>Firefox Mobile (Gecko)</th>
   <th>IE Mobile</th>
   <th>Opera Mobile</th>
   <th>Safari Mobile</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>

<h3 id="Kompatibilität_Initialisierender_Ausdruck">Kompatibilität: Initialisierender Ausdruck</h3>

<p>Vor SpiderMonkey 40 {{geckoRelease(40)}}, war es möglich einen initialisierenden Ausdruck (<code>i=0</code>) in einer <code>for…in</code>-Schleife zu benutzen:</p>

<pre class="brush: js example-bad">var obj = {a:1, b:2, c:3};
for(var i=0 in obj) {
  console.log(obj[i]);
}
// 1
// 2
// 3
</pre>

<p>Dieses nicht standardisierte Verhalten wird ab der Version 40 ignoriert und führt im <a href="/en-US/docs/Web/JavaScript/Reference/Strict_mode">strict-Modus</a> zu einem {{jsxref("SyntaxError")}}, "<a href="/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_for-in_initializer">for-in loop head declarations may not have initializers</a>" (siehe {{bug(748550)}} und {{bug(1164741)}}).</p>

<p>Andere Umgebungen wie v8 (Chrome), Chakra (IE/Edge), und JSC (WebKit/Safari) prüfen ebenfalls die Möglichkeit, dieses Verhalten zu entfernen.</p>

<h2 id="See_also" name="See_also">Siehe auch</h2>

<ul>
 <li>{{jsxref("Statements/for...of", "for...of")}} – eine ähnliche Anweisung, die Eigenschafts<em>werte</em> durchläuft</li>
 <li>{{jsxref("Statements/for", "for")}}</li>
 <li><a href="/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators">Generatorausdrücke</a> (verwenden die <code>for…in</code>-Syntax)</li>
 <li><a href="/en-US/docs/Enumerability_and_ownership_of_properties">Aufzählbarkeit und Besitz von Eigenschaften</a></li>
 <li>{{jsxref("Object.getOwnPropertyNames()")}}</li>
 <li>{{jsxref("Object.prototype.hasOwnProperty()")}}</li>
 <li>{{jsxref("Array.prototype.forEach()")}}</li>
</ul>