Object.prototype.valueOf()
Die valueOf()
-Methode von Object
-Instanzen konvertiert den this
-Wert in ein Objekt. Diese Methode soll von abgeleiteten Objekten für eine benutzerdefinierte Typumwandlungslogik überschrieben werden.
Probieren Sie es aus
Syntax
valueOf()
Parameter
Keine.
Rückgabewert
Der this
-Wert, in ein Objekt konvertiert.
Hinweis: Damit valueOf
während der Typumwandlung nützlich ist, muss es einen primitiven Wert zurückgeben. Da alle primitiven Typen ihre eigenen valueOf()
-Methoden haben, ruft das Aufrufen von aPrimitiveValue.valueOf()
im Allgemeinen nicht Object.prototype.valueOf()
auf.
Beschreibung
JavaScript ruft die valueOf
-Methode auf, um ein Objekt in einen primitiven Wert umzuwandeln. Sie müssen die valueOf
-Methode selten selbst aufrufen; JavaScript ruft sie automatisch auf, wenn es auf ein Objekt stößt, bei dem ein primitiver Wert erwartet wird.
Diese Methode wird vorrangig durch numerische Umwandlung und primitive Umwandlung aufgerufen, aber bei der String-Umwandlung wird toString()
vorrangig aufgerufen, und toString()
gibt sehr wahrscheinlich einen String-Wert zurück (sogar für die Basisimplementierung von Object.prototype.toString()
), so dass valueOf()
in diesem Fall normalerweise nicht aufgerufen wird.
Alle Objekte, die von Object.prototype
erben (also alle außer den null
-Prototyp-Objekten), erben die toString()
-Methode. Die Basisimplementierung von Object.prototype.valueOf()
ist absichtlich nutzlos: Durch die Rückgabe eines Objekts wird ihr Rückgabewert niemals von einem Primitiven Umwandlungsalgorithmus verwendet. Viele eingebaute Objekte überschreiben diese Methode, um einen angemessenen primitiven Wert zurückzugeben. Wenn Sie ein benutzerdefiniertes Objekt erstellen, können Sie valueOf()
überschreiben, um eine benutzerdefinierte Methode aufzurufen, so dass Ihr benutzerdefiniertes Objekt in einen primitiven Wert umgewandelt werden kann. Im Allgemeinen wird valueOf()
verwendet, um einen Wert zurückzugeben, der für das Objekt am sinnvollsten ist — im Gegensatz zu toString()
muss es sich nicht um einen String handeln. Alternativ können Sie eine [Symbol.toPrimitive]()
-Methode hinzufügen, die noch mehr Kontrolle über den Konvertierungsprozess ermöglicht und bei jeder Typumwandlung gegenüber valueOf
oder toString
bevorzugt wird.
Beispiele
Verwendung von valueOf()
Die Basis valueOf()
-Methode gibt den this
-Wert selbst zurück, falls erforderlich in ein Objekt konvertiert. Daher wird ihr Rückgabewert niemals von einem primitiven Umwandlungsalgorithmus verwendet.
const obj = { foo: 1 };
console.log(obj.valueOf() === obj); // true
console.log(Object.prototype.valueOf.call("primitive"));
// [String: 'primitive'] (a wrapper object)
Überschreiben von valueOf für benutzerdefinierte Objekte
Sie können eine Funktion erstellen, die anstelle der Standard-valueOf()
-Methode aufgerufen wird. Ihre Funktion sollte keine Argumente annehmen, da sie beim Aufruf während der Typumwandlung keine übergeben bekommt.
Zum Beispiel können Sie eine valueOf()
-Methode zu Ihrer benutzerdefinierten Klasse Box
hinzufügen.
class Box {
#value;
constructor(value) {
this.#value = value;
}
valueOf() {
return this.#value;
}
}
Mit dem vorhergehenden Code wird jedes Mal, wenn ein Objekt des Typs Box
in einem Kontext verwendet wird, in dem es als primitiver Wert (aber nicht speziell als String) dargestellt werden soll, automatisch die im vorangegangenen Code definierte Funktion aufgerufen.
const box = new Box(123);
console.log(box + 456); // 579
console.log(box == 123); // true
Normalerweise wird die valueOf()
-Methode eines Objekts von JavaScript aufgerufen, aber Sie können sie auch selbst wie folgt aufrufen:
box.valueOf();
Verwendung des unären Plus auf Objekten
Unäres Plus führt eine Zahlenumwandlung seines Operanden durch, was für die meisten Objekte ohne [Symbol.toPrimitive]()
bedeutet, dass valueOf()
aufgerufen wird. Wenn das Objekt jedoch keine benutzerdefinierte valueOf()
-Methode hat, wird durch die Basisimplementierung valueOf()
ignoriert und stattdessen der Rückgabewert von toString()
verwendet.
+new Date(); // the current timestamp; same as new Date().getTime()
+{}; // NaN (toString() returns "[object Object]")
+[]; // 0 (toString() returns an empty string list)
+[1]; // 1 (toString() returns "1")
+[1, 2]; // NaN (toString() returns "1,2")
+new Set([1]); // NaN (toString() returns "[object Set]")
+{ valueOf: () => 42 }; // 42
Spezifikationen
Specification |
---|
ECMAScript Language Specification # sec-object.prototype.valueof |
Browser-Kompatibilität
BCD tables only load in the browser