8

オブジェクトが数値コンテキストで 1 つの値を返し、文字列コンテキストでまったく異なる値を返すようにします。以下は動作しません。

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 に答える