Doppeltes Ausrufezeichen
LuiG
- javascript
Hallo!
Bin heute auf doppeltes Ausrufezeichen im Javascript Code einer Bibliothek gestossen. Leider habe ich nirgends Informationen dazu finden koennen.
this.op = !!(window.opera && document.getElementById);
Prinzipiell koennte das ja ein doppeltes NOT sein, aber welchen Sinn macht das?
Wuerde mich freuen, wenn jemand dazu mehr schreiben koennte!
Danke,
LuiG
n'Abend!
this.op = !!(window.opera && document.getElementById);
Prinzipiell koennte das ja ein doppeltes NOT sein, aber welchen Sinn macht das?
Es ist im Prinzip ein verkappter Typecast von "irgendwas" nach "booloean": Einmal negieren wandelt nach "boolean" und kehrt den Wahrheitswert um, nochmaliges Negieren ergibt wieder den Wahrheitswert des ursprünglichen Ausdrucks - aber dann ist das Ergebnis garantiert vom Typ "boolean".
Ob das im konkreten Fall sinnvoll und nötig ist, mag bezweifelt werden. Schädlich ist es jedenfalls nicht.
Ciao,
Martin
Hallo!
Danke fuer die schnellen Antworten!
Es klingt logisch, auf die Art und Weise ein Casting zu machen. Zumal JS meines Wissens ja logischerweise (keine exakte Datentypdeklaration) auch kein "richtiges" Casting beherrscht, oder?
Gruss,
LuiG
Hallo,
Es klingt logisch, auf die Art und Weise ein Casting zu machen. Zumal JS meines Wissens ja logischerweise (keine exakte Datentypdeklaration) auch kein "richtiges" Casting beherrscht, oder?
Variablen bzw. Objekte haben gewisse Typen, die können durch Wertzuweisungen beliebig wechseln, ja. Hier gehts aber eher um »namenlose« Zwischenresultate von Ausdrücken. Während der »Berechnung« eines Ausdrucks werden intern dutzende Werte erzeugt und es werden automatisch interne Typenumwandlungsfunktionen aufgerufen, was das Zeug hält. Der Programmierer bekommt davon meistens nichts mit. Er wundert sich höchstens, dass, anders als in anderen Programmiersprachen, Operatoren wie && und || nicht notwendigerweise Boolean-Werte ergeben.
Mathias
Hi Martin!
Es ist im Prinzip ein verkappter Typecast von "irgendwas" nach "booloean":
Nein, Herr Doktor. Von mir hat er das bestimmt nicht.
Cool,
H☼psel
Hi LuiG!
this.op = !!(window.opera && document.getElementById);
Prinzipiell koennte das ja ein doppeltes NOT sein, aber welchen Sinn macht das?
Das ist es auch.
Wuerde mich freuen, wenn jemand dazu mehr schreiben koennte!
Ich kann mir nur vorstellen, dass das als automatische Typumwandlung gedacht ist.
Das ist die einzige Idee, die ich als JavaScript-Laie habe.
MfG H☼psel
Hallo,
this.op = !!(window.opera && document.getElementById);
Prinzipiell koennte das ja ein doppeltes NOT sein, aber welchen Sinn macht das?
!! sind tatsächlich zwei normale Verneinungsoperatoren hintereinander. Doppelte Verneinung ist bekanntlich Bejahung. Das hat keinen logischen Sinn, man benutzt !! einfach zur Umwandlung von Datentypen.
Die Notwendigkeit ergibt sich aus den internen JavaScript-Regeln für die Auflösung von Ausdrücken. Die werden halt wie mathematische Terme nach ganz bestimmten Regeln »ausgerechnet«.
Ein Ausdruck mit dem Operator &&, z.B. a && b, liefert in JavaScript nicht true oder false, sondern das Argument, das, wenn es in in Typ Boolean umgewandelt werden würde, true ergibt. Wenn beide Argumente true ergeben, wird das zweite zurückgegeben, im Beispiel b.
Wenn ich also schreibe:
window.opera && document.getElementById
dann ergeben im Opera beide Argumente, wenn sie in Boolean umgewandelt werden würden (window.opera ist bereits Boolean), true. Folglich ergibt dieser Ausdruck den Inhalt der Eigenschaft document.getElementById.
document.getElementById ist bekanntlich eine Methode, also ein Funktionsobjekt. Wenn ich schreiben würde:
this.op = window.opera && document.getElementById;
Dann würde im Opera in der op-Eigenschaft eine Referenz auf diese Methode gespeichert. Man will aber eine klare Boolean-Variable in this.op haben. Was macht man also? Am einfachsten wäre:
this.op = Boolean(window.opera && document.getElementById);
Warum macht man das nicht? Keine Ahnung. Ich halte es für die klarste und verständlichste Schreibweise.
Es ist halt auch möglich, den Operator ! zu verwenden. Der führt nämlich erst einmal eine Typenumwandlung zu Boolean durch und kehrt dann um. !(window.opera && document.getElementById) liefert also in jedem Fall einen Boolean-Wert. Allerdings den umgekehrten. Daher wird noch ein ! davorgesetzt, um den Wert wieder gerade zu rücken.
Soweit ich es im Kopf habe, müssten !!(...) und Boolean(...) denselben Effekt haben.
Mathias