2010-12-30 7 views
3

kann jeder erklären, wie man für ... in statement in javascript. Ich hatte den w3school Artikel gelesen, aber ich denke, es ist nicht so clear.Below der Code ist, dies bitte erklären:was ist für .... in statement in javascript

<html> 
<body> 
<script type="text/javascript"> 
var x; 
var mycars = new Array(); 
mycars[10] = "Saab"; 
mycars[20] = "Volvo"; 
mycars[30] = "BMW"; 

for (x in mycars) 
{ 
document.write(mycars[x] + "<br />"); 
} 
</script> 
</body> 
</html> 

Antwort

6

A for in loop wird in einem Objekt durch jede Eigenschaft laufen.

In Ihrem Beispiel wird die x Variable durch jede Eigenschaft im mycars Objekt durchlaufen.

Wenn Sie mycars.expensive = "Porsche"; hinzufügen, wird es das auch finden.


zu beachten, dass, wie von MDC angegeben, for in Schleifen sollten nicht einer Schleife durch gewöhnliche Arrays verwendet werden:

Obwohl es verlockend sein kann dies als eine Möglichkeit, verwenden, um über iterieren ein Array, das ist eine schlechte Idee. Die for...in Anweisung iteriert über benutzerdefinierte Eigenschaften zusätzlich zu den Array-Elementen, so , wenn Sie das Array nicht ganzzahligen oder nicht-positiven Eigenschaften ändern (zB durch Hinzufügen einer "foo" Eigenschaft ihm oder auch durch Zugabe von ein Verfahren oder Eigenschaft Array.prototype), wird die for...in Anweisung zurückgeben den Namen Ihrer benutzerdefinierten Eigenschaften zusätzlich zu den numerischen Indizes. Da die Reihenfolge der Iteration beliebig ist, kann ein Array, das über iteriert, möglicherweise keine Elemente in numerischer Reihenfolge aufrufen. Daher ist es besser, eine traditionelle for Schleife mit einem numerischen Index zu verwenden, wenn Iterieren über Arrays. Ähnliche Argumente könnten sogar gegen Verwendung für ... in verwendet werden, um all (zumindest ohne propertyIsEnumerable() oder hasOwnProperty() Kontrollen), da es auch über Object.prototype laufen wird (was, wenn auch in der Regel entmutigt, kann, wie im Fall von Array.prototype, seine nutzbringend durch den Benutzer erweitert, wo es keine Namespacing Bedenken Einbeziehung anderer Bibliotheken verursacht, die nicht die oben genannten Prüfungen auf solche Iterationen durchführen könnte und wo sie sind bewusst der Effekt, wie diese Erweiterung auf eigene Verwendung vonhaben wirdIteratoren wie für ... in).

+0

es jQuery zu benutzen? – dramasea

+4

'for in'-Schleifen können mit jedem Objekt verwendet werden, sollten aber nicht für normale Arrays verwendet werden. – SLaks

0

Die for ... in Konstruktion iteriert in dem Objekt auf der rechten Seite von in jedes Element über. In Ihrem Fall wird der Block unter der for Anweisung einmal für jedes Auto in mycars ausgeführt.

1

Zuerst erstellen Sie einen Objekt mit 3 Einträgen (und nicht ein Array)

var mycars = new Object(); 
    mycars[10] = "Saab"; 
    mycars[20] = "Volvo"; 
    mycars[30] = "BMW"; 

wo 10, 20 und 30 sind die Objekteigenschaften.
dann möchten Sie durch das Objekt navigieren, alle Eigenschaften anzeigen und jeden Wert anzeigen, der einer Eigenschaft zugeordnet ist. Diese

ist, wo die [for (variableinObjekt) Ausdruck] JavaScript-Konstruktion greift:
Die variable wird auf die erste Eigenschaft des Objekts festgelegt werden, dann auf den zweiten, dann bis zum letzten. Versuchen

for (v in mycars) alert(v); 

um zu sehen, wie es funktioniert, und dies auch

for (v in mycars) alert("Property: "+v+", value: "+mycars[v]); 
+0

Sie sollten nicht befürworten, 'for..in' mit' Array' zu verwenden. – Phrogz

+0

Kopierte den Code eingefügt - habe nicht gesehen, es war ein Array :-) Änderte die Antwort ... –

0

for in ist eine Möglichkeit, Fehler für spätere Generationen zu begraben zu entdecken. Wie ausführlich dargelegt wurde, wird es, wenn es auf ein Array angewendet wird, alle Elemente des Arrays sowie die Länge des Arrays und alle anderen Daten, die dem Array zugeordnet sind, durchlaufen. Die Anwendung auf ein gewöhnliches Objekt ist besser, aber Sie sollten die Indizes immer noch durch hasOwnProperty filtern.

Besser einen Rahmen bereitgestellte Funktion wie kann auf ein Array gelten nur $.each