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