Hallo,
Mal zum Verständnis die interne Auflösungen der Expressions:
alert(new Boolean(false)); // gibt "false" aus -> Wert des Objektes
⇒ (new Boolean(false)).toString()
⇒ "false"
if (new Boolean(false)) { alert("true!") } // gibt "true" aus -> Objekt selbst wird als "true" interpretiert
⇒ Boolean(new Boolean(false)))
Umwandlung in Boolean gemäß ToBoolean
Input Type ist Object, also
⇒ true
// ergibt "false" -> Wert des Objektes
if (new Boolean(false) != false) {
Hier wird das rechte false gemäß dem Abstract Equality Comparison Algorithm in einen Number-Wert umgewandelt:
⇒ new Boolean(false) == 0
Dann wird das Boolean-Objekt in einen Primitive umgewandelt. Das erfolgt über den DefaultValue mit dem Hint Number. Darin wird die Methode valueOf() aufgerufen. Und die gibt den Primitive Value false zurück. D.h.
⇒ (new Boolean(false)).valueOf() == 0
⇒ false == 0
Damit sind wir wieder beim Abstract Equality Dingsbums, woraufhin wieder in Number umgewandelt wird:
⇒ 0 == 0
⇒ true
Diese valueOf-Methode sollte man sich ohnehin mal merken, die haben alle Objekte, zu denen auch Primitive-Typen existieren.
// ergibt "true" -> Typ des Wertes des Objektes ist eben kein primitive
if (new Boolean(false) !== false) {
⇒ !(new Boolean(false) === false)
Beim Strict Equality Comparison Algorithm werden zuerst die Typen verglichen. Es steht Object versus Boolean, somit sind die Typen ungleich, ergo
⇒ !(false)
⇒ true
Mathias