Start · Sprachen · JavaScript · Referenz · new String()

new String()

Methode

Der <code>String()</code>-Konstruktor erzeugt mit <code>new</code> ein String-Objekt (Wrapper), ohne <code>new</code> wandelt er einen Wert in einen primitiven String um.

seit JavaScript ES1 (Baseline: alle Browser) Kategorie: method-property

Signatur

new String(value)

Beschreibung

Mit new String(value) entsteht ein String-Objekt, also eine Objekt-Hülle um einen primitiven String. typeof liefert dafür "object" und nicht "string". Das Objekt hat alle String-Methoden, eine length-Eigenschaft und indizierte Zeichen. Wie jedes Objekt kann es zusätzlich eigene Eigenschaften speichern.

Ruft man String(value) ohne new als Funktion auf, erhält man einen primitiven String. Das ist in der Praxis fast immer gewünscht: So wandelt man beliebige Werte sicher in Text um. Anders als value.toString() funktioniert das auch mit null und undefined, und anders als die Verkettung mit "" auch mit Symbolen.

String-Objekte braucht man selten. Primitive Strings bekommen beim Methodenaufruf automatisch eine temporäre Hülle (Autoboxing). new String() sieht man deshalb fast nur in Lehrbeispielen, in altem Code oder wenn man bewusst ein eigenes Objekt mit Identität braucht.

Parameter

Name Typ Default Beschreibung
$value any "" (leerer String) Beliebiger Wert, der in einen String umgewandelt wird. Objekte werden über Symbol.toPrimitive, toString() bzw. valueOf() umgewandelt. Ein Symbol führt mit new zu einem TypeError, als reiner Funktionsaufruf String(sym) ist es erlaubt.

Rückgabewert

Typ
String (Objekt) | string
Beschreibung
Mit new: ein String-Objekt, dessen valueOf() den primitiven Wert liefert. Ohne new: ein primitiver string.

Beispiele

Objekt und primitiver String im Vergleich

const obj = new String('Hallo');
const prim = String('Hallo');

console.log(typeof obj);          // Objekt-Hülle
console.log(typeof prim);         // primitiver Wert
console.log(obj == prim);         // lockerer Vergleich wandelt um
console.log(obj === prim);        // strikter Vergleich: unterschiedliche Typen
console.log(obj.valueOf() === prim);
console.log(obj.length, obj[1]);
object string true false true 5 a

Sichere Umwandlung beliebiger Werte mit String() ohne new

const werte = [42, null, undefined, true, [1, 2], { a: 1 }, Symbol('id')];

const texte = werte.map((v) => String(v));
console.log(texte);

// Zum Vergleich: null.toString() würde einen TypeError werfen
[ '42', 'null', 'undefined', 'true', '1,2', '[object Object]', 'Symbol(id)' ]

Falle: String-Objekte sind immer truthy und untereinander nie gleich

const leer = new String('');
if (leer) {
  console.log('Wird ausgeführt – das Objekt ist truthy!');
}

const a = new String('abc');
const b = new String('abc');
console.log(a === b);                      // zwei verschiedene Objekte
console.log(a.valueOf() === b.valueOf());  // Vergleich der primitiven Werte
Wird ausgeführt – das Objekt ist truthy! false true

Symbol mit new String() vs. String()

const sym = Symbol('token');

console.log(String(sym));

try {
  new String(sym);
} catch (err) {
  console.log(err.constructor.name, err.message);
}
Symbol(token) TypeError Cannot convert a Symbol value to a string

// Wichtig · Fallstricke

  • new String() vermeiden: String-Objekte sind immer truthy, auch new String(''). Zwei gleich lautende Objekte sind mit === nie gleich, und typeof liefert "object". Das führt leicht zu schwer auffindbaren Fehlern. Linter wie ESLint warnen davor mit der Regel no-new-wrappers.
  • Für die Umwandlung in Text String(value) oder Template-Literale verwenden. value.toString() wirft bei null und undefined einen Fehler, '' + value und `${value}` werfen bei Symbolen einen TypeError.
  • Ob etwas ein String ist (primitiv oder Objekt), prüft man zuverlässig mit typeof x === 'string' || x instanceof String. Über Realm-Grenzen hinweg, etwa zwischen iframes, funktioniert Object.prototype.toString.call(x) === '[object String]'.
  • Die Fehlermeldung bei Symbolen ist je nach Engine anders formuliert. Das Beispiel zeigt die Meldung von V8.
  • Der Konstruktor ist in allen Browsern und in Node.js verfügbar.