Hilfe bei Javascript - wieso ist "string" kein String?
let x = {} + {};
console.log(typeof(x)); // "string"
console.log(x instanceof String); "false"
4 Antworten
Du addierst zwei Objekte und ich vermute mal, dass Javascript diese Objekte dann in den einfachen Standardtyp string umwandelt. Damit wird dann "" + "" = "" daraus. Das ist dann aber noch kein String-Objekt.
Es gibt zwei Arten von Strings: primitive Strings und String-Objekte.
Ein primitiver String ist ein einfacher Textwert, der zum Typ string gehört z.B. "Hello world!".
String-Objekte hingegen werden intern mit new String() erstellt, was sie zu Objekten macht, die den Typ object haben. Ein Beispiel dafür ist 'new String("Hello world!")'.
Wir merken uns: Es gibt zwei unterschiedliche Arten von Strings und zwei unterschiedliche Arten den String-Typ zu erkennen (typeof() und instanceof String)
typeof() gibt dir den Typen der Variable zurück:
"Hello world" = string (primitiver String)
new String("Hello world!") = object (Objekt String)
instanceof String prüft, ob es sich um ein Objekt String handelt und gibt true oder false zurück:
"Hello world" = false (primitiver String)
new String("Hello world!") = true (Objekt String)
Wenn du let x = {} + {} schreibst, wird daraus ein primitiver String. Beide leeren Objekte {} werden durch den + Operator in Strings umgewandelt. Da {} ein Objekt ist, gibt die Umwandlung immer den Wert "[object Object]" zurück. Deshalb ergibt {} + {} den String "[object Object][object Object]". Die Umwandlung von Objekten zu Strings folgt der standardmäßigen toString() Methode von Objekten, die "[object Object]" zurückgibt.
Weil es intern anscheinend einen Unterschied zwischen string und String gibt.
JavaScript ist case-sensitive.
Ist mir im Nachhinein auch aufgefallen. Ich habe mich geirrt. Wie soll ich verfahren?
Schau dir mal meine Antwort an, da habe ich es ausführlich erklärt ^^
string ist ein Primitive Datatype für diesen Funktioniert Instaceof nicht denn das funktioniert nur für Klassen.
string ist der primitive Datatype und String ist hingegen der objektorientierte Typ. Damit ist string eben keine Instanz von String.
Das hat damit nicht direkt etwas zu tun weil dynamische typisierung ja nur bedeutet, dass der Typ einer Variable nicht angegeben werden muss und sich implizit ändern kann.
Eine Variable hat aber auch bei Javascript zu jedem Zeitpunkt einen bestimmten Typ, sonst hätte instanceof auch keinen Sinn. In dem Fall ist der Typ string aber nicht String.