Object.prototype.valueOf()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Die valueOf()
-Methode von Object
-Instanzen wandelt den this
-Wert in ein Objekt um. Diese Methode soll von abgeleiteten Objekten für benutzerdefinierte Typkonvertierung überschrieben werden.
Probieren Sie es aus
function MyNumberType(n) {
this.number = n;
}
MyNumberType.prototype.valueOf = function () {
return this.number;
};
const object1 = new MyNumberType(4);
console.log(object1 + 3);
// Expected output: 7
Syntax
valueOf()
Parameter
Keine.
Rückgabewert
Der this
-Wert, in ein Objekt konvertiert.
Hinweis:
Damit valueOf
bei der Typkonvertierung nützlich ist, muss es einen primitiven Wert zurückgeben. Da alle primitiven Typen ihre eigenen valueOf()
-Methoden haben, ruft der Aufruf von aPrimitiveValue.valueOf()
in der Regel nicht Object.prototype.valueOf()
auf.
Beschreibung
JavaScript ruft die valueOf
-Methode auf, um ein Objekt in einen primitiven Wert zu konvertieren. Sie müssen die valueOf
-Methode selten selbst aufrufen; JavaScript ruft sie automatisch auf, wenn ein Objekt anstelle eines primitiven Werts erwartet wird.
Diese Methode wird vorrangig bei der numerischen Konvertierung und primitiven Konvertierung aufgerufen, jedoch ruft die Zeichenfolgenkonvertierung toString()
vorrangig auf, und toString()
liefert sehr wahrscheinlich einen Zeichenfolgenwert zurück (sogar in der Object.prototype.toString()
-Basisimplementierung), so dass valueOf()
in diesem Fall normalerweise nicht aufgerufen wird.
Alle Objekte, die von Object.prototype
erben (d.h. alle außer null
-Prototyp-Objekten), erben die toString()
-Methode. Die Object.prototype.valueOf()
-Basisimplementierung ist bewusst nutzlos: Indem sie ein Objekt zurückgibt, wird ihr Rückgabewert niemals von einem primitiven Konvertierungsalgorithmus verwendet. Viele eingebaute Objekte überschreiben diese Methode, um einen geeigneten 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 konvertiert 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 kein String sein. Alternativ können Sie eine [Symbol.toPrimitive]()
-Methode hinzufügen, die noch mehr Kontrolle über den Konvertierungsprozess ermöglicht und immer gegenüber valueOf
oder toString
bei jeder Typkonvertierung bevorzugt wird.
Beispiele
Verwendung von valueOf()
Die Basis-valueOf()
-Methode gibt den this
-Wert selbst zurück, der in ein Objekt konvertiert wird, wenn er es noch nicht ist. Daher wird ihr Rückgabewert niemals von einem primitiven Konvertierungsalgorithmus 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 ihr keine übergeben werden, wenn sie während der Typkonvertierung aufgerufen wird.
Beispielsweise können Sie Ihrer benutzerdefinierten Klasse Box
eine valueOf
-Methode hinzufügen.
class Box {
#value;
constructor(value) {
this.#value = value;
}
valueOf() {
return this.#value;
}
}
Mit dem obigen Code wird jedes Mal, wenn ein Objekt vom Typ Box
in einem Kontext verwendet wird, in dem es als primitiver Wert dargestellt werden soll (aber nicht speziell als String), automatisch die im obigen Code definierte Funktion aufgerufen.
const box = new Box(123);
console.log(box + 456); // 579
console.log(box == 123); // true
Eine valueOf
-Methode eines Objekts wird in der Regel von JavaScript aufgerufen, aber Sie können sie auch selbst aufrufen, wie folgt:
box.valueOf();
Verwendung von einstelligen Plus auf Objekten
Einstelliges Plus führt eine Zahlkonvertierung auf seinem Operanden durch, was bei den meisten Objekten ohne [Symbol.toPrimitive]()
bedeutet, dass valueOf()
aufgerufen wird. Hat das Objekt jedoch keine benutzerdefinierte valueOf()
-Methode, bewirkt die Basisimplementierung, dass valueOf()
ignoriert wird und der Rückgabewert von toString()
stattdessen verwendet wird.
+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® 2026 Language Specification # sec-object.prototype.valueof |