試一試
function MyNumberType(n) {
this.number = n;
}
MyNumberType.prototype.valueOf = function () {
return this.number;
};
const object = new MyNumberType(4);
console.log(object + 3);
// Expected output: 7
語法
valueOf()
引數
無。
返回值
this 值,已轉換為物件。
注意: 為了使 valueOf 在型別轉換中有用,它必須返回一個原始值。由於所有原始型別都有自己的 valueOf() 方法,因此呼叫 primitiveValue.valueOf() 通常不會呼叫 Object.prototype.valueOf()。
描述
JavaScript 會呼叫 valueOf 方法來 將物件轉換為原始值。你很少需要自己呼叫 valueOf 方法;JavaScript 在遇到需要原始值的地方自動呼叫它。
此方法優先被 數值轉換 和 原始值轉換 呼叫,但是 字串轉換 會優先呼叫 toString(),而 toString() 很可能返回字串值(即使是 Object.prototype.toString() 的基本實現),因此在這種情況下通常不呼叫 valueOf()。
所有繼承自 Object.prototype 的物件(即除 null 原型物件 之外的所有物件)都繼承了 toString() 方法。Object.prototype.valueOf() 的基本實現故意沒有用:透過返回一個物件,其返回值永遠不會被任何 原始值轉換演算法 使用。許多內建物件會覆蓋此方法以返回適當的原始值。當你建立一個自定義物件時,可以覆蓋 valueOf() 來呼叫自定義方法,這樣你的自定義物件就可以被轉換為原始值。通常,valueOf() 用於返回對物件最有意義的值——與 toString() 不同,它不必是字串。或者,你可以新增一個 [Symbol.toPrimitive]() 方法,該方法可以對轉換過程進行更精細地控制,並且在任何型別轉換中都將始終優先於 valueOf 或 toString。
示例
使用 valueOf()
基本 valueOf() 方法返回 this 值本身,如果它不是物件,則會轉換為物件。因此,它的返回值永遠不會被任何原始值轉換演算法使用。
const obj = { foo: 1 };
console.log(obj.valueOf() === obj); // true
console.log(Object.prototype.valueOf.call("primitive"));
// [String: 'primitive'] (a wrapper object)
為自定義物件覆蓋 valueOf
你可以建立一個函式來代替預設的 valueOf 方法。你的函式不應該接受任何引數,因為在型別轉換期間呼叫時不會傳遞任何引數。
例如,你可以為自定義類 Box 新增一個 valueOf 方法。
class Box {
#value;
constructor(value) {
this.#value = value;
}
valueOf() {
return this.#value;
}
}
在前面的程式碼生效後,任何時候型別為 Box 的物件在需要表示為原始值(但不是字串)的上下文中被使用時,JavaScript 都會自動呼叫前面程式碼中定義的函式。
const box = new Box(123);
console.log(box + 456); // 579
console.log(box == 123); // true
物件的 valueOf 方法通常由 JavaScript 呼叫,但你也可以像這樣自己呼叫它
box.valueOf();
對物件使用一元加號
一元加號 對其運算元執行 數值轉換,對於大多數沒有 [Symbol.toPrimitive]() 的物件,這意味著呼叫其 valueOf()。但是,如果物件沒有自定義的 valueOf() 方法,基本實現將導致 valueOf() 被忽略,而是使用 toString() 的返回值。
+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
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # sec-object.prototype.valueof |
瀏覽器相容性
載入中…