molily: Mein Problem ist gelöst!

Beitrag lesen

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