{"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 klassische Verwendungsfall der Vergleichsoperatoren ist die If-Bedingung:<\/p>\n
if (false || 42) \/\/ ...<\/pre>\nIf 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>\nJavascript: || und && k\u00f6nnen mehr<\/h2>\nR\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>\nR\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>\nAnwendung: 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>\nfunction add(x, y) {\r\n\tx = x || 42;\r\n\ty = y || 10;\r\n\treturn x + y;\r\n}<\/pre>\nWerden x<\/code> und y<\/code> zu false<\/code> konvertiert, so bekommen sie auf schnelle und einfache Weise einen Defaultwert.<\/p>\nProblemf\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\n0 == false<\/code><\/li>\n\"\" == false<\/code><\/li>\nfalse == false<\/code><\/li>\n<\/ul>\nF\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>\nIn 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}]}}