2016-05-23 11 views
1

fand ich in diesem Code-Schnipsel JS von Google minimierte:Was bedeutet diese For-Schleife?

_ga.utils.getValidColumnGroups = function(a) { 
    for (var b = [], c = 0, d; d = _ga.metadata.items[c]; ++c) 
     d = d.attributes.group, 
     a && (d = _ga.utils.getNormalizedName(d)), 
     -1 == b.indexOf(d) && b.push(d); 

    return b 
}; 

Ohne zu viel speziell konzentriert, was diese Funktion tun wird,

  • Ich frage mich, wie das enden wird Schleifen, wenn die Anweisung Bedingungen weist Werte zu und nicht den typischen Vergleichsoperator?

    d = _ga.metadata.items[c]

  • Was vor allem mit variabler d in dieser Linie passieren?

    var b = [], c = 0, d;

  • In normalen Fällen wird es mit der letzten Anweisung des Kommas zuweisen. Aber vielleicht sind es nicht die Fälle in bestimmten Situationen. Wenn nicht, sind die ersten beiden Aufgaben nutzlos. Was diese Linien machen?

    d = d.attributes.group, a && (d = _ga.utils.getNormalizedName(d)), -1 == b.indexOf(d) && b.push(d);

+2

Wenn d einen booleschen oder undefinierten Wert (oder eine Variante, bei der eine Bedingung als falsch gelesen wird) endet, wird die Schleife beendet. Und für den zweiten Teil ist dies nur Instanziierung, um sicher zu gehen, dass wir mit der richtigen Scope-Variable arbeiten. – AxelH

+0

@AxelH: Das macht Sinn!Fühlen Sie sich frei, es als die Antwort zu machen – geckob

+0

@ AxelH - die Verwendung einer Variablendeklaration mit * var * in einem * for * -Ausdruck beschränkt den Gültigkeitsbereich nur auf den umgebenden Ausführungskontext. * let * ist erforderlich, um den Umfang auf den Block * for * zu beschränken. ;-) – RobG

Antwort

1

Ich frage mich, wie das enden wird Schleifen, wenn die Bedingungen Anweisung Werte zuweisen und nicht die typische Vergleichsoperator ist?

d = _ga.metadata.items[c] 

Das Ergebnis dieses Ausdrucks wird der Wert auf d zugeordnet, so wird die Schleife beendet, wenn d einen Falsey Wert zugewiesen wird (dh, wenn _ga.metadata.items [c] liefert einen falschen Wert wie undefined, 0, null, usw.).

Was passiert besonders mit der Variable d in dieser Zeile?

var b = [], c = 0, d; 

die einfach Variablendeklarationen einige gekettet ist. Es erklärt b, c und d und initialisiert sie mit einer Leer-Anordnung, die Zahl Null und undefinierten (die Standardeinstellung, wenn Variablen deklariert werden) ist.

0

Ich frage mich, wie diese Schleifen enden, wenn die Bedingung Anweisung ist Werte zuweisen und nicht die typischen Vergleichsoperator?

d = _ga.metadata.Artikel [c]

Der Zustand ohne Bediene schreiben kann, wie eine einfache Endlosschleife

while(true){} 

dies wie

var infinite = true; 
while(infinite){} 

schreiben werden kann, sondern auch

var infinite; 
while(infinite = true){} //this is a frequente mistake witch and up with infinite loop instead of while(infinite== true); 

Zunächst legen Sie zuerst den Wert fest und prüfen dann den Zustand.

In Ihrem Beispiel, diese Arbeit für jede andere Variante, die eine Bedingung als falsch wie ein undefiniertes

liest Was vor allem mit variabler d in dieser Linie passieren?

var b = [], c = 0, d;

Dies ist der Deklarationsteil der Schleife. Sie können im ersten Teil einer for (;;) Schleife beliebig viele deklarieren.

0

Wie in den meisten Sprachen die for Schleife wird wie folgt beschrieben:

for(a; b; c) d; 
  • Run-Befehl a
  • Run-Befehl b und wandelt das Ergebnis boolean.
  • Wenn der Boolesche Wert wahr war, die Anweisungen d und c ausführen und die Anweisung b erneut auswerten, andernfalls die Schleife beenden.

Da in JavaScript Sammlungen undefined zurück, wenn Sie versuchen, über ihre Länge zuzugreifen und undefined zum boolean false konvertieren, können Sie durch ein Array-ähnliches Objekt wie folgen durchlaufen:

for(var i=0, item; item = myArray[i]; ++i) { 
    // code here 
} 

Da Sie Ich werde den Artikel wahrscheinlich trotzdem verwenden, es ist eine gute Idee, ihn in einer Variablen zu speichern, um den Code effizienter und sauberer zu machen. Es ist noch nützlicher für Objekte, die nicht genau Arrays sind, wie zum Beispiel eine NodeList, da ihre Eigenschaft length tatsächlich etwas Zeit benötigt, um sie zu berechnen (dies kann zwischen Browsern variieren). The Google JavaScript Style Guide actually recommends doing this for that reason.


-1 == b.indexOf(d) && b.push(d); 

Dies ist ein sehr, sehr hässlich Code Praxis. Es Mißbräuche der & & Betreiber, dies zu tun:

if(b.indexOf(d) == -1) b.push(d); 

Es spart 1 Charakter und macht den Code viel weniger lesbar. TU das niemals.

+0

Dies ist eine verkleinerte Version. Also sollte es hässlich sein, denke ich – geckob