Object.prototype.valueOf()
试一试
语法
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]()
方法,它允许更细粒度地控制转换过程,并且对于任何类型转换始终优先于 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 语言规范 # sec-object.prototype.valueof |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。