试一试
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 |
浏览器兼容性
加载中…