JS.next

JavaScriptの最新実装情報を追うブログ

@@toPrimitiveが実装された

概要

オブジェクトがプリミティブ型に変換される際に、どんな処理を行いどんな値を返すか決めるためのビルトインシンボルが実装された。


解説

JavaScriptでは様々な場合で様々にオブジェクトがプリミティブ型に変換される。
例えば「Number(obj)」や「String(obj)」とすると、それぞれ数値型と文字列型が期待され、
通常それぞれオブジェクトの「valueOf」メソッドと「toString」メソッドが呼び出されることになる。

一方、例えば加算演算子「+」で評価されるとき、両辺の値はまずプリミティブ型に変換されるが、これには期待される型はない。
そのような時、殆どのオブジェクトは「valueOf」メソッドが呼ばれるが、Dateオブジェクトは「toString」メソッドが呼ばれるという特殊な振る舞いをする。

そのようにオブジェクトがプリミティブ型に変換されるときの振る舞いを制御したい場合に使えるのが@@toPrimitiveである。


基本

@@toPrimitiveメソッドは、第一引数にどういう型が期待される変換かのヒント文字列が与えられて呼ばれる。
ヒント文字列は「"default"」「"number"」「"string"」の3種類である。
このメソッドが返す値が次の処理に使われることになる。

var obj = {
  [Symbol.toPrimitive](hint) { console.log(hint); return 123 }
}


加算演算子「+」で評価されるときは期待される型はない。

obj + 1  // 124  // "default"


符号反転単項演算子「-」で評価されるときは数値型が期待される。

-obj  // -123  // "number"


プロパティキーとして評価されるときは文字列が期待される。

({[obj](){}})  //// "string"


実装されるバージョン

V8 4.7.14(@@toPrimitive) 4.7後期(だいたい仕様通り) 4.8(ほぼ仕様通り)