对象同时存在valueOf和toString方法的调用顺序
当一个对象同时存在 valueOf
和 toString
方法时,在进行隐式类型转换时,JavaScript 引擎会优先调用 valueOf
方法。只有当 valueOf
方法返回的值不是原始类型(如字符串、数字等)时,才会调用 toString
方法。
以下是一个示例:
const obj = {
value: 42,
valueOf() {
return this.value;
},
toString() {
return `The value is ${this.value}`;
}
};
console.log(obj + 10); // 输出: 52
console.log(String(obj)); // 输出: "The value is 42"
在上面的例子中,obj
对象同时定义了 valueOf
和 toString
方法。当我们将 obj
对象与数字 10 相加时,JavaScript 引擎会自动调用 obj
对象的 valueOf
方法,将其转换为原始值进行计算。结果为 52。
而在使用 String
函数将 obj
对象转换为字符串时,JavaScript 引擎会先调用 valueOf
方法。由于 valueOf
方法返回的是原始值,不是字符串类型,所以 JavaScript 引擎会继续调用 toString
方法来获取对象的字符串表示。结果为 "The value is 42"。
总结起来,在对象同时存在 valueOf
和 toString
方法时,valueOf
方法优先级更高,会在进行隐式类型转换时首先被调用。只有在 valueOf
方法返回的值不是原始类型时,才会调用 toString
方法。