8

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

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"
4

1 回答 1

3

加法运算符将使用内部抽象操作将两个操作数转换为基元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"

于 2013-06-14T12:47:08.993 回答