{"id":1092,"date":"2012-03-19T19:53:14","date_gmt":"2012-03-19T18:53:14","guid":{"rendered":"https:\/\/sgaul.de\/?p=1092"},"modified":"2014-03-13T21:34:50","modified_gmt":"2014-03-13T20:34:50","slug":"variablenzuweisung-und-ausgabe-mit-dem-oder-operator","status":"publish","type":"post","link":"https:\/\/sgaul.de\/2012\/03\/19\/variablenzuweisung-und-ausgabe-mit-dem-oder-operator\/","title":{"rendered":"Variablenzuweisung und Ausgabe mit dem Oder-Operator ||"},"content":{"rendered":"

Ein wirklich sch\u00f6nes Feature von Javascript ist das Verhalten von Und- (&&) und Oder-Operator (||). Anders als in den meisten mir bekannten Sprachen liefern diese n\u00e4mlich keinen Boolean zur\u00fcck. Dank automatischer Typkonvertierung ist dies auch nicht n\u00f6tig.<\/p>\n

Der Klassiker: || liefert Boolean<\/h2>\n

Der klassische Verwendungsfall der Vergleichsoperatoren ist die If-Bedingung:<\/p>\n

if (false || 42) \/\/ ...<\/pre>\n

If entscheidet anhand eines boolschen Wertes, ob der nachstehende Code ausgef\u00fchrt werden soll. Daher muss || in typisierten Sprachen wie Java eben einen solchen Typen zur\u00fcckliefern.<\/p>\n

Javascript ist darauf nicht angewiesen: if (true)<\/code> und if (42)<\/code> laufen auf das selbe hinaus. Grandios ist nun die Idee, dies f\u00fcr && und || auszunutzen.<\/p>\n

Javascript: || und && k\u00f6nnen mehr<\/h2>\n

R\u00fcckgabe von zwei mit || verglichenen Elementen<\/h3>\n
    \n
  • das einzige positive Element<\/li>\n
  • das letzte von zwei negativen Elementen<\/li>\n
  • das erste von zwei positiven Elementen<\/li>\n<\/ul>\n

    Die Regeln sind von oben nach unten abzuarbeiten. Ein paar Beispiele:<\/p>\n

    console.log(1     || 42);   \/\/ 1\r\nconsole.log(42    || 1);    \/\/ 42\r\nconsole.log(false || 42);   \/\/ 42\r\nconsole.log(false || null); \/\/ null\r\nconsole.log(\"\"    || 42);   \/\/ 42<\/pre>\n

    R\u00fcckgabe von zwei mit && verglichenen Elementen<\/h3>\n
      \n
    • das negative Element<\/li>\n
    • das erste von zwei negativen Elementen<\/li>\n
    • das letzte von zwei positiven Elementen<\/li>\n<\/ul>\n
      console.log(1     && 42);   \/\/ 42\r\nconsole.log(42    && 1);    \/\/ 1\r\nconsole.log(false && 1);    \/\/ false\r\nconsole.log(false && null); \/\/ false<\/pre>\n

      Anwendung: Defaultwerte f\u00fcr Paramter<\/h2>\n

      Die genannten Eigenschaften lassen sich super daf\u00fcr nutzen, Parameter zu pr\u00fcfen und direkt Default-Werte zu setzen, wenn diese nicht angegeben sind.<\/p>\n

      Ein Beispiel, dass dies verdeutlicht und zu gleich zeigt, wie man es nicht<\/em> macht:<\/p>\n

      function add(x, y) {\r\n\tx = x || 42;\r\n\ty = y || 10;\r\n\treturn x + y;\r\n}<\/pre>\n

      Werden x<\/code> und y<\/code> zu false<\/code> konvertiert, so bekommen sie auf schnelle und einfache Weise einen Defaultwert.<\/p>\n

      Problemf\u00e4lle<\/h3>\n

      F\u00fcr eine Additionsfunktion ist obige Wahl denkbar ungeeignet. Man darf nicht vergessen, dass f\u00fcr Javascript auch 0 == false<\/code> gilt. Man muss also vorsichtig sein, wenn der Parameter vom Typ Number, String oder Boolean ist:<\/p>\n

        \n
      • 0 == false<\/code><\/li>\n
      • \"\" == false<\/code><\/li>\n
      • false == false<\/code><\/li>\n<\/ul>\n

        F\u00fcr diese F\u00e4lle sollte man z.B. auf Inline-Conditions zur\u00fcckgreifen:<\/p>\n

        function add(x, y) {\r\n\tx = (typeof x == 'number') ? x : 42;\r\n\ty = (typeof y == 'number') ? y : 10;\r\n\treturn x + y;\r\n}<\/pre>\n

        In vielen F\u00e4llen kann man die obigen Eigenschaften aber sehr gut anwenden und schnell und einfach sicherstellen, dass ein Parameter \u201etrue\u201c ist. Auch die Eigenschaften von && lassen sich \u00e4hnlich nutzen, allerdings sind die entsprechenden Anwendungsf\u00e4lle selten, nicht wirklich in meiner Denkweise verankert oder beides.<\/p>\n","protected":false},"excerpt":{"rendered":"

        Ein wirklich sch\u00f6nes Feature von Javascript ist das Verhalten von Und- (&&) und Oder-Operator (||). Anders als in den meisten mir bekannten Sprachen liefern diese n\u00e4mlich keinen Boolean zur\u00fcck. Dank automatischer Typkonvertierung ist dies n\u00e4mlich nicht n\u00f6tig.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[91],"tags":[158],"_links":{"self":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts\/1092"}],"collection":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/comments?post=1092"}],"version-history":[{"count":7,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts\/1092\/revisions"}],"predecessor-version":[{"id":2523,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts\/1092\/revisions\/2523"}],"wp:attachment":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/media?parent=1092"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/categories?post=1092"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/tags?post=1092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}