2016-05-11 16 views
5

Ich bin ziemlich neu in Javascript und versucht, genau herauszufinden, wie sie die for...in Schleife Arbeiten auf, wie die in Operator funktioniert.In-Operator vor und nach dem in Schleife

This klärte die Verwirrung auf.

Allerdings bin ich jetzt verwirrt, warum der in Operator false in allen Szenarien neben dem allerletzten zurückgibt.

Es sieht aus wie die for...in Schleife ist der Schlüssel Keytest in obj mit dem Wert seiner letzten Iteration erzeugt wird.

Ist mein Verständnis richtig? Erstellen for...in Loops Schlüssel/Werte in dem Objekt, über das sie iterieren, wenn sie verwendet werden, um alle Objektschlüssel zu durchlaufen?

Wenn ja jede Hilfe auf Verständnis wirklich helfen würde.

var keyTest, obj = {} 
keyTest in obj; // false 
for(var keyTest in obj) { obj[keyTest] }; 
keyTest in obj; // false 

obj = { a : 1, b : 2 }; 
keyTest in obj; // false 
for(var keyTest in obj) { obj[keyTest] }; 
keyTest in obj; // true 
obj[keyTest] // 2 
+1

'for-in' iteriert einfach über Objektschlüssel, nichts mehr. – zerkms

+0

und 'in' wird true zurückgeben, wenn das Objekt die angegebene Eigenschaft enthält. keytest und obj sind beide unabhängige Objekte, keines ist eine Eigenschaft des anderen .... –

Antwort

3

Sie for...in Schleifen erstellen Schlüssel/Wert im Objekt sie iterieren, wenn verwendet, um durch all ein Objekt Schlüssel zu gehen?

Nein, aber sie weisen der Iterationsvariablen Schlüssel zu (var keyTest in Ihrem Fall). Und deshalb produzieren Ihre Beispiele die Ergebnisse, die Sie sehen.

// keyTest = undefined (initialisation of the hoisted variable) 
var keyTest, obj = {} // keyTest === undefined 
keyTest in obj; // keyTest === undefined 
for(var keyTest in obj) { obj[keyTest] }; // `obj` is empty and `keyTest` stays what it is 
keyTest in obj; // false // keyTest === undefined 

// keyTest = undefined (initialisation of the hoisted variable) 
obj = { a : 1, b : 2 }; // keyTest === undefined 
keyTest in obj; // keyTest === undefined 
for(var keyTest in obj) { obj[keyTest] }; // keyTest = "a", keyTest = "b" 
keyTest in obj; // keyTest === "b" 
1

Ich bin jetzt verwirrt, warum die in Operator gibt false

in Operator akzeptiert 2 Operanden:

  • links auf e ist der Schlüssel Name
  • und das rechte wird das Objekt Test gegen

Also für diese Code-Schnipsel

var keyTest, obj = {} 
keyTest in obj; // false 

die keyTest ist undefined (Sie es nicht haben, zu testen, initialisiert mit der Wert). Also sind die Überprüfung Sie, wenn "undefined" (es wäre zu bespannen gegossen werden, da Objekte können nur * halten String Eigenschaften) ist eine der obj Objektschlüssel, die nicht der Fall, daher false.

for(var keyTest in obj) { obj[keyTest] }; 
keyTest in obj; // true 

Hier gibt true weil die keyTest Variable den Wert der neuesten iterativen Schlüssel hält, nachdem die Schleife beendet ist. Sie testen also, ob sich ein tatsächlicher Schlüssel im Objekt befindet.

2

Es Hebe Problem. Es gibt keinen Bereich auf Blockebene in es5, daher wird Ihre keyTest Variable am Anfang des Bereichs gehisst und deklariert (Funktion oder global, hängt davon ab, wo Sie Ihren Code ausführen).

Also var keyTest ist keine Blockvariable, sondern Scopevariable, entsprechend bezieht es sich auf die gleiche Variable in jeder Zeile Ihres Codes, wo es in diesem Bereich verwendet wird. Und das ist ein Grund, warum Ihre for Schleife diesem Iterationswert den letzten Wert zuweist.


Wenn über Ihr Beispiel zu sprechen, ist der Grund, warum Sie zwei unterschiedliche Ergebnisse haben, ist, dass in erstem Beispiel, das Sie keine Schlüssel in Ihrem obj haben, so for Schleife jede Iteration nicht tut, wird demnach nicht Weisen Sie Ihrem keyTest einen beliebigen Wert zu, so dass es immer noch undefiniert ist.


Aber es6 hat zum Beispiel Block-Level-Variablen. Wenn Sie also in Ihrer for-Schleife var in let (Block-Level-Variablendeklarationsschlüsselwort) ändern und diesen Code in einer es6-kompatiblen Umgebung ausführen, haben Sie eine andere Ausgabe. Vielleicht hilft dir das zu verstehen, was vor sich geht.

//es6 code 
var keyTest; 
obj = { a : 1, b : 2 }; 
keyTest in obj; // false 
for(let keyTest in obj) { obj[keyTest] }; 
keyTest in obj; // false 
obj[keyTest] // undefined