Javascript 使TopPrimitive转换取决于上下文

Javascript 使TopPrimitive转换取决于上下文,javascript,types,Javascript,Types,我希望一个对象在数字上下文中返回一个值,在字符串上下文中返回一个完全不同的值。下面的方法不起作用 foo = { toString: function() { return "string" }, valueOf: function() { return 123 } } console.log(foo * 2) // got 246, fine console.log("hi " + foo) // got "hi 123", want "hi string"

我希望一个对象在数字上下文中返回一个值,在字符串上下文中返回一个完全不同的值。下面的方法不起作用

foo = {
    toString: function() { return "string" },
    valueOf:  function() { return 123 }
}

console.log(foo * 2)       // got 246, fine
console.log("hi " + foo)   // got "hi 123", want "hi string"
将使用内部抽象操作将两个操作数转换为原语,然后,如果一个操作数是字符串,则将使用内部抽象操作将两个操作数转换为字符串(注意:这与userland对象上的
toString
方法不同。)

结果是,在语言中添加了,您现在可以实现您的目标:

const foo={
[Symbol.toPrimitive](提示){
开关(提示){
大小写“字符串”:
案例“默认”:
返回“字符串”
案例“编号”:
返回123
违约:
抛出“无效提示”
}
}
}
console.log(foo*2)//246

log(“hi”+foo)/“hi string”
实际上,另一个问题的答案几乎可以解释为什么,以及为什么没有“如何”。唯一的解决办法似乎是编写
console.log(“hi”+String(foo))
或使用
foo.toString()
来看看。就对象引用而言,它与特定类型是一样的。@Alnitak:唉,看来你是对的,没有其他方法了。既然另一个问题没有提到解决办法,你能把你的评论转换成答案供他人参考吗?