Signatur
Beschreibung
valueOf() gibt den primitiven Zeichenkettenwert zurück, der in einem String-Objekt steckt. Ruft man die Methode auf einem primitiven String auf, bekommt man denselben Wert unverändert zurück. Das Ergebnis ist dasselbe wie bei String.prototype.toString().
Selbst ruft man die Methode nur selten auf. JavaScript nutzt sie intern, wenn ein Objekt in einen primitiven Wert umgewandelt werden muss, etwa bei Vergleichen mit ==, bei der Verkettung mit + oder in Template-Literalen (dort über Symbol.toPrimitive bzw. toString()/valueOf()).
Wirklich nützlich ist valueOf(), wenn man einen per new String() erzeugten Wrapper wieder in einen echten primitiven String umwandeln will, damit typeof, strikte Gleichheit (===) und Map-/Set-Schlüssel wie erwartet funktionieren.
Rückgabewert
String-Objekts bzw. des Strings.Beispiele
String-Objekt in einen primitiven Wert umwandeln
const wrapper = new String('Hallo');
const primitiv = wrapper.valueOf();
console.log(typeof wrapper); // Objekt
console.log(typeof primitiv); // primitiver String
console.log(primitiv);
Strikte Gleichheit mit String-Objekten richtig herstellen
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 Werte
console.log(a == 'abc'); // implizites valueOf()
Werte vor der Nutzung als Set-Schlüssel normalisieren
const eingaben = [new String('rot'), 'rot', new String('blau')];
// Ohne Normalisierung wäre jedes Objekt ein eigener Eintrag
const farben = new Set(eingaben.map((s) => s.valueOf()));
console.log([...farben]);
Aufruf auf primitivem String
const name = 'Ada';
console.log(name.valueOf() === name);
// Wichtig · Fallstricke
- Fehler bei falschem
this: Wird die Methode percallauf etwas aufgerufen, das kein String und keinString-Objekt ist, wirft sie einenTypeError, z. B. beiString.prototype.valueOf.call({}). Eine allgemeine Umwandlung wie beiString(wert)findet nicht statt. - Verzichte auf
new String(). Wrapper-Objekte sind in bedingten Ausdrücken immer wahr (auchnew String('')) und verhalten sich bei===undtypeofanders als primitive Strings. Zum Umwandeln nimmst du besserString(wert)ohnenew. - Das Ergebnis ist dasselbe wie bei
toString(). Welche der beiden Methoden JavaScript bei der impliziten Umwandlung zuerst aufruft, hängt vom Kontext ab (Hinweis"string"oder"default"). - Wird in allen Browsern und in Node.js unterstützt.