Object.prototype.valueOf()

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

valueOf() 方法用於將 Object 例項的 this轉換為物件。此方法旨在由派生物件進行覆蓋,以實現自定義的 型別轉換 邏輯。

試一試

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

語法

js
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]() 方法,該方法可以對轉換過程進行更精細地控制,並且在任何型別轉換中都將始終優先於 valueOftoString

示例

使用 valueOf()

基本 valueOf() 方法返回 this 值本身,如果它不是物件,則會轉換為物件。因此,它的返回值永遠不會被任何原始值轉換演算法使用。

js
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 方法。

js
class Box {
  #value;
  constructor(value) {
    this.#value = value;
  }
  valueOf() {
    return this.#value;
  }
}

在前面的程式碼生效後,任何時候型別為 Box 的物件在需要表示為原始值(但不是字串)的上下文中被使用時,JavaScript 都會自動呼叫前面程式碼中定義的函式。

js
const box = new Box(123);
console.log(box + 456); // 579
console.log(box == 123); // true

物件的 valueOf 方法通常由 JavaScript 呼叫,但你也可以像這樣自己呼叫它

js
box.valueOf();

對物件使用一元加號

一元加號 對其運算元執行 數值轉換,對於大多數沒有 [Symbol.toPrimitive]() 的物件,這意味著呼叫其 valueOf()。但是,如果物件沒有自定義的 valueOf() 方法,基本實現將導致 valueOf() 被忽略,而是使用 toString() 的返回值。

js
+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

瀏覽器相容性

另見