Tag molily.
Ich sehe nicht, dass bei Funktion == true Funktion.toString() aufgerufen werden muss. Und selbst wenn, das verschiebt die Frage nur. Warum ergibt Boolean("bla") true, "bla" == true aber false?
Naja, die Antwort kann ich anhand der von dir verlinkten Dokumentation nur ahnen. Wenn ich die Ausführungen in 12.5 richtig verstehe, liegt es wohl an der Abarbeitung von "Expression". Ist diese der Name einer Variable, Funktion oder eines Objektes, wird zunächst GetValue(foo) aufgerufen, die den Type von foo zurückgibt. Dieser liefert dann nach den Regeln für ToBoolean true oder false. Damit ist die Abfrage erledigt. Mal ein Beispiel:
foo = "";
if(foo) alert ("foo!");
Nichts passiert. Kann auch nicht, denn GetValue ergibt einen leeren String, der nach den Regeln für ToBoolean false ergibt. Anders verhält es sich beim Equals-Operator. Wenn ich das richtig verstehe, würde foo == true zu GetValue(foo) == GetValue("true"), erst danach geht's weiter mit 11.9.3.
Im Ergebnis wäre doch GetValue(foo) vom Typ Object o.ä. (jedenfalls kein Primitive Value), während GetValue("true") ein Primitive Value vom Typ "Boolean" ergäbe, oder? Damit läge keine Typengleichheit vor, und man überspringt 1. bis 13. und landet in der Folge beim einzig passenden Eintrag "19. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y)." ToNumber("true") ergibt 1, also m.E. keine Übereinstimmung, sodass man schlussendlich bei "22. Return false." landet.
Eine Abfrage if(foo) prüft die Existenz von foo, egal, ob Eigenschaft, Methode oder Objekt. Die Abfrage if(foo == wert) prüft, ob foo den Wert "wert" hat, und genau das funktioniert nur bei Eigenschaften, nicht aber bei Methoden oder Objekten.
Das verstehe ich nicht. Oder du sagst etwas selbstverständliches. Natürlich sind Methoden und Objekte keine »primitive values«.
Eben. Aus diesem Grund ist es nach meiner Meinung nicht ohne weiteres möglich, die Existenz einer Methode mittels if(foo == true) abzufragen, und genau darauf wollte ich eigentlich hinaus (Stein des Antoßes):
Du weißt doch sicher um den Unterschied zwischen Eigenschaft und Methode. Selbstverständlich hat das window-Objekt eine Methode focus, aber keine Eigenschaft, ergo wird deine Abfrage immer false ergeben.
Diese Aussage ist also so lange richtig, bis nicht eine Eigenschaft mit dem Namen focus und dem Wert "true" selbst definiert wird.
Oder etwa nicht?
Siechfred