这是我的代码
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
原型函数不起作用?
答案 0 :(得分:1)
模板字符串将表达式格式化为字符串,因此调用f.seek(0)
。
一元Sub Test()
LR = 10
Do Until LR = 20
'Inside the loop you can use Exit Sub if a condition is meet before LR = 20
If LR > 20 Then
Exit Sub
End If
LR = LR + 1
Loop
End Sub
运算符将其操作数转换为数字,这是原始值。因此它使用user1.toString()
来转换对象。
答案 1 :(得分:1)
为什么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
是因为
toString
,valueOf
。toString
的默认实现返回一个原始值,因此算法在此处停止并且不尝试valueOf
。
let user1 = {
toString() {
console.log('toString');
return super.toString();
},
valueOf() {
console.log('valueOf');
return 10;
}
};
console.log(`${user1}`);
规范的相关部分: