でconsole.log("hello " + obj);
、 の型変換を行う演算子obj
は+
、加算演算子と呼ばれます。
加算演算子では、文字列にキャストされる代わりに、各引数が型ヒントなしでプリミティブ値にキャストされます。型ヒントなしでオブジェクトがプリミティブにキャストされると、メソッドvalueOf
が使用可能であればそれが使用されます。valueOf
呼び出し可能でない場合、または非プリミティブ値を返す場合にのみtoString
使用されます。と の両方が非プリミティブ値valueOf
を返す場合、 aがスローされます。toString
TypeError
仕様の引用:
http://es5.github.com/#x11.6.1
11.6.1 加算演算子 ( + )
1) lref を AdditiveExpression の評価結果とする。
2) lval を GetValue(lref) とする。
3) rref を MultiplicativeExpression の評価結果とする。4) rval を GetValue(rref) とする。5) lprim を ToPrimitive(lval) とする。
6) rprim を ToPrimitive(rval) とする。
7) Type(lprim) が String または Type(rprim) が String の場合、
...
注 1手順 5 と 6 の ToPrimitive の呼び出しでは、ヒントは提供されません。
http://es5.github.com/#x9.1
9.1 プリミティブへ
...
Object - オブジェクトのデフォルト値を返します。オブジェクトのデフォルト値は、オブジェクトの [[DefaultValue]] 内部メソッドを呼び出し、オプションのヒント PreferredType を渡すことによって取得されます。[[DefaultValue]] 内部メソッドの動作は、8.12.8 のすべてのネイティブ ECMAScript オブジェクトについて、この仕様によって定義されています。
http://es5.github.com/#x8.12.8
8.12.8 [[DefaultValue]] (ヒント)
O の [[DefaultValue]] 内部メソッドがヒントなしで呼び出されると、O が Date オブジェクト (15.9.6 を参照) でない限り、ヒントが Number であるかのように動作します。弦。
...
O の [[DefaultValue]] 内部メソッドがヒント Number で呼び出されると、次の手順が実行されます。
1) valueOf を、オブジェクト O の [[Get]] 内部メソッドを引数「valueOf」で呼び出した結果とする。
2) IsCallable(valueOf) が true の場合、
- val を valueOf の [[Call]] 内部メソッドを呼び出した結果とし、O を this 値とし、引数リストを空にします。
- val がプリミティブ値の場合、val を返します。
...