这是我的代码
let user1 = {
valueOf() {
console.log(20);
return 10;
}
};
console.log(`${user1}`); // [object Object]
// user1.__proto__.toString
let user2 = {
toString() {
console.log(20);
return 10;
}
};
console.log(+user2); // 20 10
// user2.__proto__.valueOf ?????????来自对象原型的user1 .__ proto __. toString函数第一次工作。为什么user2.__proto__.valueOf原型函数不能工作?
发布于 2019-10-16 21:23:05
为什么valueOf原型函数不能工作
我假设您是在问为什么不调用默认的valueOf方法?这实际上是被称为,但这并不是全部发生。
当将对象转换为原语时,将调用toString或valueOf。首先调用哪一个取决于它应该转换成哪种原语。
当一个对象被转换为一个数字时,顺序是valueOf,toString。如果toString不返回原语值,则调用valueOf。valueOf的默认实现就是这样,它返回对象本身:
var obj = {};
console.log(obj.valueOf() === obj)
知道了这一点,我们可以通过实现自己的valueOf来验证调用方法的顺序,但返回与缺省值相同的值:
let user2 = {
valueOf() {
console.log('valueOf');
return super.valueOf();
},
toString() {
console.log('toString');
return 10;
}
};
console.log(+user2); // 20 10
您的第一个示例user1不调用valueOf,因为
由于值被转换为字符串,方法的调用顺序是valueOf.
toString的默认实现返回一个基本值,因此算法停止,不尝试valueOf.
let user1 = {
toString() {
console.log('toString');
return super.toString();
},
valueOf() {
console.log('valueOf');
return 10;
}
};
console.log(`${user1}`);
规范的相关部分:
发布于 2019-10-16 21:14:04
模板字符串将表达式格式化为字符串,因此它调用user1.toString()。
一元+运算符将其操作数转换为一个数字,这是一个原语值。因此,它使用user2.valueOf()来转换对象。
https://stackoverflow.com/questions/58421747
复制相似问题