Don P: Syntax für eine if-Bedingung

Hallo zusammen,

Bin gerade auf eine mir bisher unbekannte Syntax für eine if-Bedingung gestoßen:

  
if(x, y) {  
  
  tuwas();  
}  

Was soll das denn? Anscheinend evaluiert die Bedingung immer zu !!y:

function testIf (x, y) {  
  
  if (x, y) { alert('Die Bedingung ist erfüllt.'); }  
  else { alert('Die Bedingung ist nicht erfüllt'); }  
}  
  
testIf(true, true); // => Die Bedingung ist erfüllt.  
testIf(true, false); // => Die Bedingung ist nicht erfüllt.  
testIf(false, true); // => Die Bedingung ist erfüllt.  
testIf(false, false); // => Die Bedingung ist nicht erfüllt.  

Hat man sowas schon gesehen?
Der Code-Abschnitt sieht so aus:

for (var a = objekt.array1[b], c = a.length, f = 0, g = a[0]; f < c; f += 1) {  
  
  if (g = a[f], objekt.funktion(objekt.array2[g])) {  
  
    b = g;  
    break;  
  }  
}  

Sehr verwirrend das Ganze.... könnte direkt von mir sein ;)
Aber wieso macht man sowas? Die Variable g wird auf jeden Fall neu zugewiesen, aber nur wenn die zweite Bedingung im if zutrifft, wird die Schleife mit break verlassen. Seltsam.

Gruß, Don P

--
sh:( fo:) ch:? rl:( br:] n4:~ ie:% mo:? va:{ js:) de:/ zu:] fl:( ss:| ls:&
  1. Hallo,

    »,« ist ein einfacher Operator – der Komma-Operator. Er verkettet mehrere Expressions, führt sie nach der Reihe aus und gibt das Ergebnis der letzten Ausdrucks zurück. Bspw.

    var foo = ('Hallo', 'Welt');  
    alert(foo); // Welt
    

    oder auch

    var foo;  
    foo = alert(1), alert(2), 3;  
    alert(3);  
    // 1, 2, 3
    

    Man kann ihn überall anwenden, wo Expressions vorkommen können. Er ist *nicht* an if gekoppelt. Er kann dort natürlich eingesetzt werden, weil dort eine Expression stehen kann.

    if (g = a[f], objekt.funktion(objekt.array2[g]))

    Ist nichts anderes als

    g = a[f];  
    if (objekt.funktion(objekt.array2[g]))
    

    Siehe
    http://es5.github.com/#x11.14
    http://javascriptweblog.wordpress.com/2011/04/04/the-javascript-comma-operator/
    https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comma_Operator

    Mathias

    1. Hallo,

      Das war mir neu, ist aber interessant. Sonst benutze ich disen Komma- Operator eigentlich nur bei Variablendeklarationen, var a = bli.bla, b = a*583.96, c = mehrZeugs;

      Sonst scheint er mir auch kaum brauchbar. Statt
      ausdruck1, ausdruck2, ausdruck3;
      kann man doch ebensogut
      ausdruck1; ausdruck2; ausdruck3;
      notieren. Wenn man wenigstens ein paar Bytes sparen würde...

      if (g = a[f], objekt.funktion(objekt.array2[g]))

      Ist nichts anderes als

      g = a[f];

      if (objekt.funktion(objekt.array2[g]))

        
      Ja, das ist mir dann auch aufgefallen.  
      Vielleicht ist es so beim Lesen deutlicher, dass die Zuweisung an g eigentlich nur wegen der if-Abfrage gemacht wird. So gesehen kann der ungewöhnliche Operator doch nützlich sein: Der Code sieht aufgeräumter aus.  
        
      Danke für die Links :)  
      Don P
      
      -- 
      sh:( fo:) ch:? rl:( br:] n4:~ ie:% mo:? va:{ js:) de:/ zu:] fl:( ss:| ls:&
      
      1. Hi,

        Sonst scheint er mir auch kaum brauchbar. Statt

        Häufiger Anwendungsfall bei mir:

        for (i = 0, imax = bla(); i < imax; i++)

        Klar, man kann das
        imax = bla();
        auch vor die Schleife schreiben, aber so ist alles, was zur Schleife gehört, beieinander.

        (und bla() wird im Gegensatz zu for(i = 0; i < bla(); i++) nur einmal ausgeführt).

        Anderer Fall:

        for (unten = 0, oben = 1000; unten < oben; unten++, oben--)

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. Stimmt, in for-Schleifen mache ich das auch oft. Anscheinend mehr unbewusst aus Gewohnheit, weil es aufgeräumter wirkt. Nur in if() hat es micht jetzt ziemlich verwirrt... Ich glaub' ich mach lieber mal Pause.

          Gruß, Don P

      2. Sonst benutze ich disen Komma- Operator eigentlich nur bei Variablendeklarationen, var a = bli.bla, b = a*583.96, c = mehrZeugs;

        Das ist *nicht* der Komma-Operator. Das ist einfach der Trenner einer Variablen-Deklarations-Liste.

        Noch mal meine Beispiel:

        var foo = ('Hallo', 'Welt');

        Hier musste ich Klammern setzen, damit das Komma als Komma-Operator und nicht als Trenner in der Variablen-Deklarations-Liste angesehen wird. var foo = 'Hallo', 'Welt'; wäre ein Syntaxfehler.

        var foo;  
        foo = alert(1), alert(2), 3;
        

        Hier habe ich Variablendeklaration und Wertzuweisung absichtlich getrennt, damit das Komma als Operator verstanden wird.

        Ich hätte auch klammern können:

        var foo = (alert(1), alert(2), 3);

        Mathias

      3. @@Don P:

        nuqneH

        if (g = a[f], objekt.funktion(objekt.array2[g]))

        Vielleicht ist es so beim Lesen deutlicher, dass die Zuweisung an g eigentlich nur wegen der if-Abfrage gemacht wird.

        Wenn die Zuweisung an g eigentlich nur wegen der if-Abfrage gemacht werden würde, dann bräuchte man sie nicht, sondern könnte
        if (objekt.funktion(objekt.array2[a[f]]))
        schreiben.

        Vermutlich wird a[f] noch öfter gebraucht und deshalb in einer Variablen gespeichert.

        Qapla'

        --
        Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
        (Mark Twain)
  2. Hi,

    Bin gerade auf eine mir bisher unbekannte Syntax für eine if-Bedingung gestoßen:
    if(x, y) {

    Hat man sowas schon gesehen?

    „Man“ sollte wissen, dass if Ausdrücke auswertet, und dass in einem solchen zwischen zwei Werten idR. irgendein Operator stehen muss, andernfalls wäre der Ausdruck syntaktisch fehlerhaft.

    Dann benutzt „man“ kurz Google, javascript comma operator, und findet sogleich im MDN den Artikel über den Comma Operator:
    “The comma operator evaluates both of its operands (from left to right) and returns the value of the second operand.”

    Ich frag mich echt, was daran für „man“ zu schwer war.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hallo,

      Ich frag mich echt, was daran für „man“ zu schwer war.

      Das Dingens ist halt so unscheinbar, dass "man" es kaum als Operator wahrnimmt, Mann. Wenn sowas in Klammern erscheint, ist es doch meistens eine Parameterliste für eine Funktion, und nicht einfach ein Operator, der den letzten Wert zurückgibt.

      Oder siehst du oft Konstrukte wie if(a, b, c) oder benutzt sie gar selber? Das glaub' ich kaum.

      Gruß, Don P

      1. Hi,

        Ich frag mich echt, was daran für „man“ zu schwer war.

        Das Dingens ist halt so unscheinbar, dass "man" es kaum als Operator wahrnimmt, Mann.

        Ich war davon ausgegangen, dass du kurz selber nachgedacht hättest, wenn du diesen kleinen Codeabschnitt schon genauerer Betrachtung unterziehst.

        Wenn sowas in Klammern erscheint, ist es doch meistens eine Parameterliste für eine Funktion, und nicht einfach ein Operator, der den letzten Wert zurückgibt.

        if ist aber keine Funktion.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Hallo,

          Ich war davon ausgegangen, dass du kurz selber nachgedacht hättest, wenn du diesen kleinen Codeabschnitt schon genauerer Betrachtung unterziehst.

          Habe ich auch, bin aber nicht darauf gekommen nach "Operator" zu googeln. Aber die Funktionsweise habe ich auch so erkannt.

          if ist aber keine Funktion.

          Eben. Hätte ja sein können, dass sich was neues im ECMA-Standard getan hat oder so. Bin seit einer ganzen Weile nicht mehr viel mit JS beschäftigt.

          Aber ok: Du hast heute wieder deinen freundlichen Tag und ich bin halt blöd, passt schon ;).

          Gruß, Don P

      2. Hi,

        Oder siehst du oft Konstrukte wie if(a, b, c) oder benutzt sie gar selber? Das glaub' ich kaum.

        nein, bei einem if-Statement sehe ich den Sinn auch nicht so richtig; bei for-Schleifen nutze ich den Komma-Operator aber auch gern und oft.
        Mir war er übrigens von C geläufig, an dem sich Javascript syntaktisch stark orientiert.

        Ciao,
         Martin

        --
        I do take my work seriously and the way to do that is not to take yourself too seriously.
          (Alan Rickman, britischer Schauspieler)
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    2. Das hätt ich aber auch nicht gefunden.
      Ich seh auch den Sinn nicht, im Fall von if.
      Ok in einer for-Schleife kann man mehreres auf einmal notieren.
      Aber im Beispiel des if macht das doch echt keinen Sinn. Ich würds nicht so nutzen, das macht doch alles nur unübersichtlich.

    3. Hallom

      Kommas kommen an vielen Stellen in JavaScript vor. Nur wenige Kommas sind tatsächlich der Komma-Operator. Die meisten sind Variable-Deklarations-Listen und Parameterlisten. Wenn man wie Don fälschlicherweise annimmt, es handele sich um ein Konstrukt if (x, y), so kommt man nicht ohne weiteres zur Annahme, dass es sich um einen allgemeinen Operator handeln könnte. Es hätte ja durchaus eine spezifische Schreibweise von if sein können.

      Mathias