オブジェクトを文字列連結したときは、toStringかvalueOfで文字列化したものが連結される。
結論
オブジェクトを文字列連結したときは、
toStringメソッドがあれば、toStringで文字列化したものを連結、
valueOfメソッドがあれば、valueOfで文字列化したものを連結、
toString/valueOfメソッド両方があれば、valueOfで文字列化したものを連結、
という動作になるようです。
Java使いとしては、toStringだけかと思ってたので、やや新鮮でした。
実験
// toStringのみ持つオブジェクト function ToStringOnly() { } ToStringOnly.prototype.toString = function() { return "toString ToStringOnly"; } // valueOfのみ持つオブジェクト function ValueOfOnly() { } ValueOfOnly.prototype.valueOf = function() { return "valueOf ValueOfOnly"; } // toString/valueOfの両方を持つオブジェクト function Both() { } Both.prototype.toString = function() { return "toString Both"; } Both.prototype.valueOf = function() { return "valueOf Both"; } // 文字列連結した場合の挙動 document.writeln("<dt>ToStringOnly: <dd>" + new ToStringOnly() + "<br/>"); document.writeln("<dt>ValueOfOnly: <dd>" + new ValueOfOnly() + "<br/>"); document.writeln("<dt>Both: <dd>" + new Both() + "<br/>"); document.writeln("<dt>Both#toString: <dd>" + new Both().toString() + "<br/>");
出力結果
ToStringOnly: toString ToStringOnly ValueOfOnly: valueOf ValueOfOnly Both: valueOf Both Both#toString: toString Both
Bothの場合は、valueOfが使われているのが分かります。
http://jsdo.it/taka_2/asTK