Hallo,
Ja, Interpreter-intern möglicherweise, der JavaScript-Programmierer kann es aber sofort wie ein Objekt verwenden - wie Axel sagt, ist es aus Sicht des Umgangs mit primitive value ein Objekt.
Naja, ich hatte eigentlich immer angenommen, dass es sowas wie primitive Datentypen in JavaScript gar nicht gibt. Insofern hatte ich Unrecht und Jörg hatte Recht.
Wichtig ist die Unterscheidung eigentlich nur in der Hinsicht, dass primitive values mit anderen primitive values identisch sein können, objects aber nur mit sich selbst. Das wirkt sich darin aus, das Objects als Referenzen übergeben werden, primitive values als Kopien.
Das bezog ich immmer auf den Kontext, aber ja, Du hast Recht, dieser Kontext ändert sich, wenn von Anfang an feststeht, dass es sich um ein Objekt handelt. Also gibt es doch einen grundsätzlichen Unterschied zwischen "Hallo Welt" und new String("Hallo Welt"), genau wie zwischen 1.234 und new Number(1.234).
Der Parser erkennt hier, dass für die Variable a ein Objekt-Kontext benötigt wird, und konvertiert daher a in ein Objekt.
Ja, ein primitive value wird bei der Auswertung des Ausdrucks value.member umgewandelt: http://bclary.com/log/2004/11/07/#a-11.2.1
Aber auch nur für diese Auswertung:
var a = "string primitive";
a.eigenschaft = "wert";
Offensichtlich passiert das gerade hier nicht. Die Eigenschaft wird nicht erzeugt.
~~~javascript
var a = "string primitive";
a.eigenschaft = "bla1";
a.methode = function() {return true;};
alert(typeof(a) + "\n" + a + "\n" + a.eigenschaft);
var b = new String("string object");
b.eigenschaft = "bla2";
b.methode = function() {return true;};
alert(typeof(b) + "\n" + b + "\n" + b.eigenschaft);
var c = 1.234;
c.eigenschaft = "bla3";
c.methode = function() {return true;};
alert(typeof(c) + "\n" + c + "\n" + c.eigenschaft);
var d = new Number(1.234);
d.eigenschaft = "bla3";
d.methode = function() {return true;};
alert(typeof(d) + "\n" + d + "\n" + c.eigenschaft);
var e = new Object(1.234);
e.eigenschaft = "bla3";
e.methode = function() {return true;};
alert(typeof(e) + "\n" + e + "\n" + e.eigenschaft);
document.write("Members von a:<br>");
for (var e in a) document.write(e + "<br>");
document.write("<br>");
document.write("Members von b:<br>");
for (var e in b) document.write(e + "<br>");
document.write("<br>");
document.write("Members von c:<br>");
for (var e in c) document.write(e + "<br>");
document.write("<br>");
document.write("Members von d:<br>");
for (var e in d) document.write(e + "<br>");
document.write("<br>");
Offensichtlich werden primitive Datentypen nur dann wie Objekte behandelt, wenn vordefinierte Methoden ihrer Objektentsprechungen (String, Number) auf sie angewandt werden. Wenn man versucht, sie wie Objekte zu erweiteren, dann misslingt dies.
viele Grüße
Axel