¿Qué sucede entre, por ejemplo, alerta (+ usuario); y su método para decidir que la pista es 'número'? Hasta ahora no puedo explicarlo más que "oh, intentaron convertirlo en un número, así que hagámoslo". Me gustaría saber cómo se ve eso realmente.
let user = { name: "John", money: 1000, [Symbol.toPrimitive](hint) { alert(`hint: ${hint}`); return hint == "string" ? `{name: "${this.name}"}` : this.money; } }; // conversions demo: alert(user); // hint: string -> {name: "John"} alert(+user); // hint: number -> 1000 alert(user + 500); // hint: default -> 1500