Hallo Ihr,
Solche grundlegenden Zusammenhänge finde ich interessant. Nur so kann man letzlich das Biest JavaScript richtig durchschauen. Nach der Lektüre eurer Diskussion stellt sich bis jetzt für mich die Sache so dar:
Es geht anscheinend darum, ob die toString-Methode oder die valueOf-Methode zum Zug kommt, wenn ein Objekt bzw. ein Primitve-Ausdruck ausgewertet wird.
Im Unterschied zu einem Primitive kann ein Objekt (eigene) Eigenschaften und Methoden haben. Wenn nun ein Objekt o1 z.B. mit
alert(o1);
nur ausgegeben werden soll, erscheint es völlig logisch, dass die Auswertung mit der toString-Methode des Objekts geschieht, denn man hat ja nicht angegeben, dass man eine bestimmte Eigenschaft/Methode des Objekts meint, geschweige denn welche.
Dieses Verhalten passt analog zu dem Umstand, dass existierende Objekte bei ähnlich einfachen Auswertungen wie
if(o1){...}
immer true ergeben. Es ist mir natürlich klar, dass bei if(o1){...} nicht die toString-Methode im Spiel ist.
function o(){} o1 = new o();
alert(o1); // [object Object]
alert( String(o1)===o1.toString() ); // true
alert( String(o1.valueOf())===o1.toString() ); // true
o.prototype.toString = function (){return 1;};
alert(o1); // 1
alert( Number(o1) ); // 1
alert( Number(o1.valueOf())===o1.toString() ); // true
o.prototype.valueOf = function (){return 2;};
alert(o1); // 1
alert( Number(o1) ); // 2
alert( Number(o1.valueOf())===o1.toString() ); // false
String() und Number() liefern entsprechende Primitives.
Wie man sieht, greift die eingebaute valueOf-Methode auf toString zu.
Sobald die valueOf-Methode aber überschrieben ist, wird diese auch ausschließlich benutzt, es sei denn, man will wirklich nur das Objekt selber mit alert() ausgeben, dann wirkt trotzdem wieder toString().
alert("Das Objekt " + o1);
"Das Objekt 1"Hier befinden wir uns in einem Additions-Ausdruck.
Ist hier mit Additionsausdruck sowohl eine numerische Addition als auch Konkatenation gemeint?
Scheint so. Wenn immer eine weitere Auswertung stattfinden soll, wie eine Addition oder Konkatenation, dann ist es auch logisch, dass man eine bestimmte Eigenschaft/Methode des Objekts meint, seinen eigentlichen Wert, den dann eben valueOf() liefert:
function o(){}
o.prototype.toString = function() { return "o"; };
o.prototype.valueOf = function() { return 1; };
o1 = new o();
alert("Das Objekt " + o1); // "Das Objekt 1"
alert(o1); // "o"
alert(o1 + o1); // 2
Gruß, Don P