ich ging davon aus, weil ich String-Methoden auch direkt auf "freistehende" Strings anwenden kann, so wie:
alert("foo".blink())
Wie gesagt, das geht, weil hier temporär ein String-Object aus "foo" erzeugt wird.
Daher meine Annahme, dass bei
var foo = "bar";
ein String-Objekt entstünde und dass beivar baz = /foo/;
ein RegExp-Objekt entstünde.
/foo/ erzeugt tatsächlich ein RegExp-Object.
Alle regulären Ausdrücke sind Objects, es gibt keine entsprechenden Primitives.
Wenn ich dich richtig verstanden habe passiert das aber erst wenn ich eine Methode darauf anwende _und_ es wird wieder in ein Primitive zurückverwandelt?
Ja. Es wird allerdings nicht zurückverwandelt, sondern die Methode erzeugt einfach einen neuen String-Primitive. Das String-Object wird verworfen.
So zumindest ist es definiert und dadurch erklärt sich das Verhalten von Objects vs. Primitives. Die JavaScript-Engines können das natürlich intern optimieren. Intern braucht es also keine Trennung geben, aber »nach außen« für den Programmierer ist die Unterscheidung sehr wirkmächtig.
Kannst du das für alle JS-Engines sicher sagen?
Ja. Das ist eine Grundlage von ECMAScript.
Mathias