molily: Abfragen von Eigenschaften, Methoden und Objekten

Beitrag lesen

Hallo,

Bei der zweiten Variante wird m.E. der "Wert" von function abgefragt, und der ist vom Typ String; das ominöse [native code], das man auch bei alert(function) erhält. Also liegt kein boolescher Wert vor, und die Abfrage wird immer false ergeben.

Das kann man so nicht sagen, ein Function-Objekt hat keinen String-Wert. alert() nimmt erst einmal alle möglichen Objekte entgegen und führt automatisch ein Funktion.toString() durch. In Ausdrücken, in denen ein String erfordert wird, ist das ebenso, zum Beispiel:
Wert = Funktion + "";
Ruft intern Funktion.toString() auf, um diesen Wert mit dem anderen String zu verketten.
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?

Allerdings:
http://bclary.com/2004/11/07/ecma-262.html#a-11.9.3
18. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
Bleibt function == 1
Dann wohl:
20. If Type(x) is either String or Number and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
Object: Return a default value for the Object. The default value of an object is retrieved by calling the internal [[DefaultValue]] method of the object, passing the optional hint PreferredType. The behaviour of the [[DefaultValue]] method is defined by this specification for all native ECMAScript objects (8.6.2.6).
Das verstehe ich dann nicht mehr. Es scheint mir aber möglich, dass bei einer Umwandlung einer Funktion in einen primitive value toString verwendet wird.
Dann hätte man "function bla () { ... }" == 1
Dann käme
17. If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x)== y.
Wenn ich das richtig sehe, käme heraus
NaN == 1
Ja, das ist dann tatsächlich false. ;)

foo = "bar";

alert(typeof window.foo); // 'String'
if(window.foo) alert("foo existiert"); // Meldung erscheint
if(window.foo == true) alert("foo ist true"); // keine Meldung
if(window.foo == "bar") alert("foo ist bar"); // Meldung erscheint


>   
> Dieses Beispiel demonstriert meine Vermutungen. 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«.  
  
Mathias