Object.prototype.valueOf()

valueOf() 方法是 Object 实例的方法,它将 this转换为对象。此方法旨在被派生对象覆盖,以实现自定义 类型转换 逻辑。

试一试

语法

js
valueOf()

参数

无。

返回值

this 值,转换为对象。

注意:为了使 valueOf 在类型转换期间有用,它必须返回一个原始值。因为所有原始类型都有自己的 valueOf() 方法,所以调用 aPrimitiveValue.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 语言规范
# sec-object.prototype.valueof

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅