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

浏览器兼容性

另见