使topprimitive转换依赖于上下文

Make toPrimitive conversion depend on the context

本文关键字:上下文 依赖于 转换 topprimitive      更新时间:2023-09-26

我希望一个对象在数字上下文中返回一个值,而在字符串上下文中返回一个完全不同的值。

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"

加法运算符将使用内部抽象操作ToPrimitive将两个操作数转换为原语,然后,如果一个操作数是字符串,它将使用内部抽象操作ToString将两个操作数转换为字符串(注意:这与用户对象上的toString方法不同)

结果是,将Symbol.toPrimitive添加到语言中,您现在可以实现您的目标:

const foo = {
  [Symbol.toPrimitive](hint) {
    switch (hint) {
      case "string":
      case "default":
        return "string"
      case "number":
        return 123
      default:
        throw "invalid hint"
    }
  }
}
console.log(foo * 2) // 246
console.log("hi " + foo) // "hi string"